如何使ActiveRecord在新的has_many关联上更新bump_at

时间:2013-04-18 16:04:25

标签: ruby-on-rails activerecord

将记录添加到has_many关联并保存父级时,该父级updated_at未被提升:

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并仅查找在过去30分钟内收到新Order s的LineItem(即:是“更新“在过去30分钟内。”

我不确定这里最好做什么,以及如何轻松实现这一目标。是否有一些标志或方法我可以设置让AR更新父母updated_at如上所述?或者我应该通过一些钩子来做到这一点?如果是这样,什么挂钩?或者我应该将此时间戳存储在不同的列中吗?

请注意,我可以通过line_items.updated_at查询join(:line_items),但这可能会使我的代码更混乱,性能更差:或者这是Rails中此类问题的首选方法吗?

2 个答案:

答案 0 :(得分:35)

您需要包含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

答案 1 :(得分:3)

您可以使用触摸选项,如下所示。

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

这将更新&#34; update_at&#34;每当保存或销毁lineitem时,父订单的数量。

引自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 / on属性之外的当前时间。