2013-04-18 27 views
19

當添加記錄到has_many關聯和保存父,是父母的updated_at沒有碰着:如何使ActiveRecord的的updated_at碰到新的has_many協會

order = Order.new 
order.save 
pp order 
    => #<Order id: 3, created_at: "2013-04-18 15:25:09", updated_at: "2013-04-18 15:25:09"> 
order.line_items << LineItem.new() 
pp order.line_items 
    => [#<LineItem id: 4, order_id: 3, created_at: "2013-04-18 15:26:16", updated_at: "2013-04-18 15:26:29", product_id: 123>] 
order.save 
pp order.reload 
    => #<Order id: 3, created_at: "2013-04-18 15:25:09", updated_at: "2013-04-18 15:25:09"> 

這是有道理的,東陽Order它沒有觸及;外鍵位於LineItem上。

然而,在這種情況下,我想查詢Order,發現只有Order,在最後30分鐘已經收到新LineItemšš(即:在最後30分鐘被「更新」)。

我不確定在這裏做什麼最好,以及我如何輕鬆實現這一目標。是否有一些標誌或方法可以讓AR更新所描述的父母updated_at?或者我應該通過一些鉤子來做到這一點?如果是這樣,什麼鉤子?或者我應該將此時間戳存儲在不同的列中?

請注意,我可以通過join(:line_items)來查詢line_items.updated_at,但這可能會使我的代碼更加混亂,性能更低:或者這是Rails中這些問題的首選方式嗎?

回答

32

您需要包含touch: true以及belongs_to :order關聯。

class Order < ActiveRecord::Base 
    has_many :line_items 
end 


class LineItem < ActiveRecord::Base 
    belongs_to :order, touch: true 
end 

這將更新關聯訂單的updated_at列。更多文檔here

3

您可以使用touch選項,如下所示。

class LineItems < ActiveRecord::Base 
    belongs_to :order, :touch => true 
    ... 
end 

只要lineitem被保存或銷燬,這將更新父Order的「update_at」。

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html報價,

:觸摸

If true, the associated object will be touched (the updated_at/on attributes set to now) when this record is either saved or destroyed. 

如果指定一個符號,該屬性將與 當前時間,除了更新的updated_at /上屬性。