我有一个带有复选框的表格,用户勾选该复选框以表示同意。发布此表单后,将使用确认提供同意的字段更新“用户”表。但是,我也想记录提供同意的日期/时间。为此,我希望拥有一个存储“是”的“ user_consent”字段和一个存储user_consent字段更新日期/时间的user_consent_agreed字段。
我知道我可以在创建表时添加时间戳,但是当任何属性更新时,它将改变。当同意属性更改时,我需要在自己的字段中记录时间/日期。
答案 0 :(得分:1)
我在表consented_at
中只有一列,其类型为DateTime
。当他们同意时,您可以更新该列:
user.update_column :consented_at, DateTime.now
我使用consented_at
使其与created_at
和updated_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。