如何在一组记录上有效地检查updated_at和created_at相等性

时间:2013-07-16 22:48:16

标签: ruby-on-rails ruby

假设我们有10条Post模型的记录,其中包含DateTime属性updated_atcreated_at

我想知道以下哪三种状态是正确的:

一个。自创建以来,所有帖子均未受影响 B.所有职位自创建以来都已更新 C.有些帖子已经更新,有些帖子未被更新

最有效的方法是什么?

2 个答案:

答案 0 :(得分:2)

如果您正在寻找快速解决方案,我的建议是额外标记updated:booleanafter_validate :set_updated_flag操作

def set_updated_flag
  update_attribute :updated, true
end

比您可以以任何方式获取它,例如使用范围

 scope :updated, where(:updated=>true)

答案 1 :(得分:1)

如果您无法更新数据库,则可以创建多个范围:

scope :changed, where('updated_at > created_at')
scope :unchanged, where('updated_at = created_at')

# Return +true+ if any Posts changed
def self.changed?
  changed.any?
end

# Return +true+ if no Posts changed
def self.unchanged?
  !changed?
end

# Return +true+ if all Posts changed
def self.all_changed?
  unchanged.empty?
end

请注意,any?empty?many? [source]已经过优化,以便在合并到范围时,可以使用count(*) vs修改实际的sql迭代ruby中的所有元素。在某些情况下,他们可能会回退到红宝石,但通常您会有更高效的查询。