Rails,ActiveRecord或gem中是否存在现有解决方案,用于获取任何关联记录的最新更改的时间戳?

时间:2012-05-10 14:34:57

标签: ruby-on-rails activerecord associations

让我说我有:

class Foo < ActiveRecord::Base
  has_many :bar
end

class Bar < ActiveRecord::Base
  belongs_to :foo
end

还假设Bar类具有时间戳字段(更新记录时自动更新的字段)。

问题:Rails,ActiveRecord或gem中是否存在现有的功能/方法调用,允许我调用一个方法来告诉我updated_at列中的最新值在任何记录中,Foo类中定义的任何关联?

因此,理论上的foo.latest_change_to_associated_objects方法应该为我提供最新updated_at字段用于任何相关记录的时间戳(在本例中为任何Bar记录)。

最简单的情况,你有一个父类,只有一个关联很简单 - 回调或两个就可以了。我很好奇某个类定义了很多关联的情况。是否有一个gem(或者我已经缺少的ActiveRecord中的功能)允许我声明我的任何/所有关联都具有此功能?

显然我可以通过SQL调用来解决这个问题,但每次检查最新更改时我都不想这样做。似乎应该有一个回调链在更改任何关联记录时自动更新父级上的latest_change_on_association字段(或任何你想要调用的字段),这样检索最新的更改时间戳就是检查的问题。父记录上的单个字段。

注意:我调查了http://api.rubyonrails.org/classes/ActiveModel/Observer.html,但问题在于我必须为每个班级编写一个观察者。如果从关联列表中创建观察者的自动化已经包含在gem或其他内容中,那就太棒了。

2 个答案:

答案 0 :(得分:2)

您可以使用:touch自动更新updated_at父记录的belongs_to时间戳(或任何其他时间戳字段)相关记录变更:

重点是我的:

  

:触摸

     

如果为true,则在保存或销毁此记录时将触摸关联的对象(设置为now的now_at / on属性)。 如果您指定了一个符号,那么除了updated_at / on属性之外,该属性将使用当前时间进行更新。

如果您真的想使用last_association_updated_at列,可以:

belongs_to :parent_class, :touch => :last_association_updated_at

请参阅Rails Guide on Associations

答案 1 :(得分:1)

我建议为父类添加一个列,该列将保存最新更改的时间戳。我们将列称为“last_association_updated_at”。然后在每个子类的关联上使用:touch选项。每当创建,修改或删除子记录时,last_association_updated_at列都将以当前时间更新。

class Foo < ActiveRecord::Base
  has_many :bar
end

class Bar < ActiveRecord::Base
  belongs_to :foo, :touch => :last_association_updated_at
end

class Baz < ActiveRecord::Base
  belongs_to :foo, :touch => :last_association_updated_at
end