当另一属性更改时,如何更改一个ActiveRecord模型属性?

时间:2020-05-25 01:55:20

标签: ruby-on-rails activerecord

考虑一个简单的示例:一个具有User(字符串)和sms_phone_number(布尔型)模型属性的sms_number_is_verified类。

具有已验证号码的现有用户现在可以更改其电话号码:

user.sms_phone_number = '+14085551212'
user.save!

此新号码尚未验证,因此应在更新电话号码的同一笔交易中将sms_number_is_verified设置为false

方法1:覆盖设置器

class User < ApplicationRecord
  def sms_phone_number=(val)
    @sms_number_is_verified = false if val != @sms_phone_number
    @sms_phone_number = val
  end
end

问题

  • 如果我采用这种简单的方法,什么会/不起作用?

方法2:脏话+回​​调

包含ActiveModel::Dirty,并执行类似的操作:

class User < ApplicationRecord
  before_save :update_sms_verification

  def update_sms_verification
    if saved_change_to_sms_phone_number?
      sms_number_is_verified = false
    end
  end
end
  • 这里会做什么/不会做什么?
  • before_save是否适合使用正确的回调?

1 个答案:

答案 0 :(得分:1)

您可以使用before_update回调并更改使用字段吗? sms_phone_number_changed?检查字段是否从以前的值更改

class User < ApplicationRecord
  before_update :set_number_not_verified

  def set_number_not_verified
    if sms_phone_number_changed? && sms_phone_number.size > 0
      @sms_number_is_verified = false
    end
  end
end