我可以在rails db中给特定字段加上时间戳吗?

时间:2018-11-15 20:05:17

标签: ruby-on-rails

我有一个带有复选框的表格,用户勾选该复选框以表示同意。发布此表单后,将使用确认提供同意的字段更新“用户”表。但是,我也想记录提供同意的日期/时间。为此,我希望拥有一个存储“是”的“ user_consent”字段和一个存储user_consent字段更新日期/时间的user_consent_agreed字段。

我知道我可以在创建表时添加时间戳,但是当任何属性更新时,它将改变。当同意属性更改时,我需要在自己的字段中记录时间/日期。

2 个答案:

答案 0 :(得分:1)

我在表consented_at中只有一列,其类型为DateTime。当他们同意时,您可以更新该列:

user.update_column :consented_at, DateTime.now

我使用consented_at使其与created_atupdated_at内联

这样,您可以判断一个人是否同意以及何时同意(如果同意)。

if user.consented_at?
  # consented and you have the time in consented_at
else
  # never consented
end

由于检查time列无论如何都会返回true或false,因此不需要boolean列和时间。

答案 1 :(得分:1)

如已经建议的,添加一个consented_at列以保存时间戳。

要在consented的值更改时自动更新此列,请向模型添加before_save回调:

class User < ApplicationRecord

  before_save do
    self.consented_at = Time.zone.now if consented_changed?
  end

end

请注意,这将consented_at的任何更改设置为consented,甚至将其设置为false。如果这不是您想要的,则可以根据需要调整回调中的代码。

有关模型回调的更多信息,请参见https://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html。有关如何检测更改的更多信息,请参见https://api.rubyonrails.org/classes/ActiveModel/Dirty.html