[英]Detect which attributes were called in `update` in rails
即使这些属性不变,是否有可能检测到Rails的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
由于该值未更改,因此将在不设置标志的情况下返回。 有没有一种方法可以检测到即使没有实际更改但notification_hour
调用的update
?
更新记录时,它将为每个要更新的属性执行一个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
回调和额外的更新。 设置notification_hour
时,只需将notifiation_time_set
设置为true
:
def notification_hour=(hour)
self.notification_time_set = true
super
end
你可以尝试这样的事情
class User < ApplicationRecord
def update(changes={})
changes[:notification_time_set] = true if changes.key?(:notification_hour)
super(changes)
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.