3

假设我们有一个Post模型的 10 条记录,它们具有 DateTime 属性updated_atcreated_at.

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

A. 自创建以来所有帖子均未更改
B. 自创建以来已更新所有帖子
C. 某些帖子已更新,有些未受影响

这样做最有效的方法是什么?

4

2 回答 2

2

如果您正在寻找一个快速的解决方案,我的建议是额外的标志updated:booleanafter_validate :set_updated_flag行动

def set_updated_flag
  update_attribute :updated, true
end

比你可以以任何你想要的方式抓住它,例如使用范围

 scope :updated, where(:updated=>true)
于 2013-07-16T22:56:39.447 回答
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 迭代 ruby​​ 中的所有元素来修改实际的 sql。在某些情况下,它们可能会退回到 ruby​​,但通常您会有更有效的查询。

于 2013-07-17T03:03:47.483 回答