У меня есть несколько моделей как так
class Bill < ActiveRecord::Base
has_many :bill_items
belongs_to :store
accepts_nested_attributes_for :bill_items
end
class BillItem <ActiveRecord::Base
belongs_to :product
belongs_to :bill
validate :has_enough_stock
def has_enough_stock
stock_available = Inventory.product_is(self.product).store_is(self.bill.store).one.quantity
errors.add(:quantity, "only #{stock_available} is available") if stock_available < self.quantity
end
end
Вышеупомянутая проверка так, очевидно, не работает, потому что, когда я читаю bill_items из вложенных атрибутов в форме счета, атрибуты bill_item.bill_id или bill_item.bill не доступны прежде чем быть сохраненным.
Таким образом, как я иду о выполнении чего-то как этот?
Да, такая проблема может раздражать. Вы можете попробовать добавить виртуальный атрибут к вашей модели Bill Item следующим образом:
class BillItem <ActiveRecord::Base
belongs_to :product
belongs_to :bill
attr_accessible :store_id
validate :has_enough_stock
def has_enough_stock
stock_available = Inventory.product_is(self.product).store_is(load_bill_store).one.quantity
errors.add(:quantity, "only #{stock_available} is available") if stock_available < self.quantity
end
private
def load_bill_store
Store.find_by_id(self.store_id)
end
end
А затем в вашем представлении вы можете добавить скрытое поле, подобное этому:
<%= bill_item.hidden_field :store_id, :value => store_id %>
Это не было проверено, но может сработать. Возможно, вы сочтете нежелательным иметь store_id в html, но это может не вызывать беспокойства. Позвольте мне знать, если это помогает.
Bill_item.bill должен быть доступен, вы можете попробовать поднять self.bill.inspect, чтобы узнать, есть он или нет, но я думаю, что проблема в другом.