2

我有一个表格用于创建一个invoice带有许多items.

class Invoice < ActiveRecord::Base
  attr_accessible :project_id, :number, :date, :recipient, :items_attributes
  accepts_nested_attributes_for :items
end

现在,当我实例化一个 newinvoice和一组 contains时items,我希望它们在保存之前items知道它们所属的内容invoice,因此我可以在我的Item模型中执行以下操作:

class Item < ActiveRecord::Base
  belongs_to :invoice
  after_initialize :set_hourly_rate

  private 

    def set_hourly_rate
      if new_record?
        self.price ||= invoice.project.hourly_rate
      end
    end   

end

现在,我的代码失败了,因为子 ( ) 在实例化期间item对其父 ( ) 一无所知。invoice只有在保存invoice(因此它的嵌套items)之后,一切都会解决。但我想在每个新项目被保存之前为其设置一个默认值。

如何才能做到这一点?

谢谢你的帮助。

4

2 回答 2

1

您可以在发票关联上添加回调,如下所示:

class Invoice < ActiveRecord::Base
  # Code
  belongs_to :project
  has_many :items, :after_add => :set_item_price

  private

  def set_item_price(item)
    item.price = project.hourly_rate
  end  

end
于 2012-10-29T15:08:59.713 回答
0

拥有invoice对象后,您可以使用通过此方法创建的.items.build方法(此处的文档) 创建子记录,但items应该有对invoice 虽然的引用,但我认为只有在 Invoice 被持久化时他们才会有引用(不太确定.)

于 2012-10-29T15:07:32.273 回答