假设我们有一个Post
模型的 10 条记录,它们具有 DateTime 属性updated_at
和created_at
.
我想知道以下三种状态中哪一种是正确的:
A. 自创建以来所有帖子均未更改
B. 自创建以来已更新所有帖子
C. 某些帖子已更新,有些未受影响
这样做最有效的方法是什么?
假设我们有一个Post
模型的 10 条记录,它们具有 DateTime 属性updated_at
和created_at
.
我想知道以下三种状态中哪一种是正确的:
A. 自创建以来所有帖子均未更改
B. 自创建以来已更新所有帖子
C. 某些帖子已更新,有些未受影响
这样做最有效的方法是什么?
如果您正在寻找一个快速的解决方案,我的建议是额外的标志updated:boolean
和after_validate :set_updated_flag
行动
def set_updated_flag
update_attribute :updated, true
end
比你可以以任何你想要的方式抓住它,例如使用范围
scope :updated, where(:updated=>true)
如果您无法更新数据库,您可以创建多个范围:
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,但通常您会有更有效的查询。