24

将记录添加到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收到新LineItems 的 s(即:在过去 30 分钟内“更新”)。

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

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

4

2 回答 2

44

您需要touch: truebelongs_to :order关联一起包括在内。

class Order < ActiveRecord::Base
  has_many :line_items
end


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

这将更新updated_at关联订单的列。更多文档在这里

于 2013-04-18T16:16:44.073 回答
3

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

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/on 属性之外,该属性还将使用当前时间进行更新。

于 2013-04-18T16:18:55.170 回答