繁体   English   中英

检测在rails的“ update”中调用了哪些属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM