让我说我有:
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或其他内容中,那就太棒了。
答案 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
答案 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