Ruby on Rails - вложенные атрибуты: Как я получаю доступ к родительской модели из дочерней модели

У меня есть несколько моделей как так

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 не доступны прежде чем быть сохраненным.

Таким образом, как я иду о выполнении чего-то как этот?

20
задан TMaYaD 9 April 2010 в 22:48
поделиться

2 ответа

Да, такая проблема может раздражать. Вы можете попробовать добавить виртуальный атрибут к вашей модели 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, но это может не вызывать беспокойства. Позвольте мне знать, если это помогает.

0
ответ дан 30 November 2019 в 00:43
поделиться

Bill_item.bill должен быть доступен, вы можете попробовать поднять self.bill.inspect, чтобы узнать, есть он или нет, но я думаю, что проблема в другом.

1
ответ дан 30 November 2019 в 00:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: