4

我有一种情况,我需要使用updated_at所有模型的字段来创建同步功能。但是在用户模型的情况下,updated_at每次用户登录时都会修改该字段。更糟糕的是,当设备使用用户的凭据登录以同步数据时,该updated_at字段只是在同步开始之前就被修改了。

所以,我的问题是,有没有办法可以updated_at在用户登录时停止设计更新字段?

4

3 回答 3

8

这就是我所做的:覆盖 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

这是在用户登录时不使缓存失效的好方法。

于 2013-10-08T22:32:11.770 回答
2

设计已经改变,所以这个问题需要更新的答案。

在我的用户模型中,我覆盖了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需要所有需要更新的列的哈希。

于 2017-03-16T19:29:25.483 回答
0

您可以向模型添加另一列并更新其日期时间,而不是尝试更改updated_at工作方式。

否则,您需要更改设计以执行以下操作:

User.record_timestamps = false
# devise save/update action
User.record_timestamps = true
于 2013-02-13T07:09:35.963 回答