检测rails

时间:2017-03-30 18:45:32

标签: ruby-on-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

这将返回而不设置标志,因为值没有改变。有没有办法检测到updatenotification_hour调用,即使它实际上并没有改变?

2 个答案:

答案 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