2

假设我有:

class Foo < ActiveRecord::Base
  has_many :bar
end

class Bar < ActiveRecord::Base
  belongs_to :foo
end

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

问题:updated_at Rails、ActiveRecord 或某处的 gem 中是否有现有的功能/方法调用允许我调用一个方法,该方法将告诉我任何记录中的列中的最新值, 在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 或其他东西中,那就太好了。

4

2 回答 2

2

当关联记录之一发生更改时,您可以使用它:touch来自动更新父记录的updated_at时间戳(或任何其他时间戳字段):belongs_to

重点是我的:

:触碰

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

如果你真的想使用你的last_association_updated_at专栏,你可以:

belongs_to :parent_class, :touch => :last_association_updated_at

请参阅有关关联的 Rails 指南

于 2012-05-10T15:04:23.753 回答
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
于 2012-05-10T15:00:16.420 回答