2010-02-19 65 views
1

我喜欢观察添加一个对象到我的has_many关系而不将它们保存到数据库。
因此,当我添加一个LineItem到我的订单中时,我喜欢调用Order :: calculate_total来更新实际的总价值。观察积极记录关系

o = Order.new
o.line_items << LineItem.new # should call calculate_total from order-object

但也有我的LineItem的积累方法没有观察员。

回答

4

我收回自己。我刚刚发现了关联回调:ActiveRecord::Associtions::ClassMethods,搜索“关联回调”。实质上:

class Order < ActiveRecord::Base 
    has_many :line_items, :after_add => :calculate_order_total 
end 

您还可以访问before_add,before_remove和after_remove。

+0

不错,那是我失踪的那个! – toy 2010-02-19 16:41:38

0

采取不同的方式:

class Order < ActiveRecord::Base 
    def add_line_item(line_item) 
    self.line_items << line_item 
    self.calculate_total 
    end 
end 

但我质疑为什么你需要计算总在每个行项目的补充。如果您在添加所有订单项后只计算一次,则可以实现同样的效果。

+0

ok,这样我就会失去使用我的订单模型的Active-record-way - 我必须确保没有人使用<< operator或order.line_items.build()。 我的想法是使用观察者将涵盖line_item添加到订单的所有方式。 如果您看到像购物车一样订购,则用户希望看到他将产品放入购物车中的总增加时间。所以必须在每条line_item上完成。 – toy 2010-02-19 15:42:04