即使这些属性没有改变,是否可以检测导轨中的update
通话中包含哪些属性?仍会调用after_update
回调,但由于实际上没有任何更改ActiveModel::Dirty
似乎没有任何方法可以检测相关属性。
示例:
我有一个user
模型,其列notification_hour
,默认为9
我致电User.update(notification_hour: 9)
这会触发回调
after_update :set_time_flag
我想设置用户至少设置时间,即使他们已将其设置为默认值。
def set_time_flag
return unless notification_hour_changed?
update_column(notifiation_time_set: true)
end
这将返回而不设置标志,因为值没有改变。有没有办法检测到update
被notification_hour
调用,即使它实际上并没有改变?
答案 0 :(得分:2)
更新记录时,它会为每个要更新的属性执行setter方法。
update(notification_hour: 9)
将执行notification_hour=(9)
所以,你可以玩它。只需重载方法以检测属性是否已设置:
after_update :set_time_flag
def notification_hour=(hour)
@notification_hour_was_set = true
super
end
private
def set_time_flag
if @notification_hour_was_set
update_column(notifiation_time_set: true)
end
end
<强>更新强>
SteveTurczyn的回答给了我更好的主意。您实际上不需要after_update
回调和额外更新。设置notifiation_time_set
时,只需将true
设置为notification_hour
:
def notification_hour=(hour)
self.notification_time_set = true
super
end
答案 1 :(得分:0)
你可以试试这样的事情
class User < ApplicationRecord
def update(changes={})
changes[:notification_time_set] = true if changes.key?(:notification_hour)
super(changes)
end
end