我有一种情况,我需要使用updated_at
所有模型的字段来创建同步功能。但是在用户模型的情况下,updated_at
每次用户登录时都会修改该字段。更糟糕的是,当设备使用用户的凭据登录以同步数据时,该updated_at
字段只是在同步开始之前就被修改了。
所以,我的问题是,有没有办法可以updated_at
在用户登录时停止设计更新字段?
我有一种情况,我需要使用updated_at
所有模型的字段来创建同步功能。但是在用户模型的情况下,updated_at
每次用户登录时都会修改该字段。更糟糕的是,当设备使用用户的凭据登录以同步数据时,该updated_at
字段只是在同步开始之前就被修改了。
所以,我的问题是,有没有办法可以updated_at
在用户登录时停止设计更新字段?
这就是我所做的:覆盖 should_record_timestamps? 设计模型上的方法,以在仅更新设计字段时不更改 updated_at 列。这是代码,它处理 Devise::Trackable 和 Rememberable。
def should_record_timestamps?
(self.changes.keys.map(&:to_sym) - (Devise::Models::Trackable.required_fields(nil) + [:remember_token, :remember_created_at])).present? && super
end
这是在用户登录时不使缓存失效的好方法。
设计已经改变,所以这个问题需要更新的答案。
在我的用户模型中,我覆盖了updated_tracked_fields!
. 自2014 年5 月 21 日 (v. 3.3.0)以来一直存在。
def update_tracked_fields!(request)
update_tracked_fields(request)
update_attrs = changes.each_with_object({}) do |(key, value), object|
object[key] = value[1]
end
update(update_attrs)
end
使用该update
方法,而不是save
因为它自动跳过验证和更新updated_at
列,我重新设计了update_attrs
因为update
需要所有需要更新的列的哈希。
您可以向模型添加另一列并更新其日期时间,而不是尝试更改updated_at
工作方式。
否则,您需要更改设计以执行以下操作:
User.record_timestamps = false
# devise save/update action
User.record_timestamps = true