Rails 5.1:如何在关联记录更改时触发回调?

时间:2019-07-18 10:23:32

标签: ruby-on-rails ruby rails-activerecord

我有两个模型UserPostalAddress。由于各种原因,我想将纬度和经度存储在User而不是PostalAddress上。如果邮政地址发生变化,我希望更新坐标。

class PostalAddress < ApplicationRecord
    belongs_to :user
    # ...
    end

我相信我想做这样的事情:

class User < ApplicationRecord
    has_one :postal_address, dependent: :destroy, required: true

    before_save :update_coords, if: :will_save_change_to_postal_address?

但失败并显示以下错误:

NoMethodError:  undefined method `will_save_change_to_postal_address?'

但是,它适用于实际上属于User的属性:

before_save :update_coords, if: :will_save_change_to_email_address?

我还了解了:after_add:before_add回调,但我知道它们仅适用于has_many集合。

相关记录更改时如何触发回调?

2 个答案:

答案 0 :(得分:1)

在PostalAddress模型中执行before_save,然后调用该方法以更新用户的经度和纬度。

class PostalAddress < ApplicationRecord
  belongs_to :user
  before_save :update_coords, if: :will_save_change_to_postal_address?
  # ...

  private

  def update_coords
    self.user.update_coordinates
  end
end

答案 1 :(得分:1)

  

如果邮政地址发生变化,我希望更新坐标。

class PostalAddress < ApplicationRecord
  before_save :update_coords

  def update_coords
    # here you can check specific attributes changes if required, else it will call every time PostalAddress changes 
    user.update(lat: calculated_value1, long: calculated_value2)
  end
end