如何在多个表Rails中更新相同数据的列

时间:2016-02-21 05:27:39

标签: ruby-on-rails activerecord

我有一张跟踪付款帐户的表PaymentAccount。我在PaymentAccount中有实例方法,如果付款帐户已准备就绪,则返回"例如account.is_payment_ready?

每次对这些记录进行更新时,我都希望在名为payment_ready的表中使用相应的布尔值更新另一列Profile。检索配置文件时,我希望能够account.is_payment_ready?来减少数据库查询数量,而不是查询profile.payment_ready

注意PaymentAccountProfile会有一对一的关联。

我的第一直觉是after_commit模型中有一个PaymentAccount钩子:

class PaymentAccount < ActiveRecord::Base
    after_commit :update_profile

    def is_payment_ready?
       if ready
          return true # if ready
       else
          return false # if not ready
       end
    end 

    def update_profile
       self.profile.payment_ready = is_payment_ready?
       self.profile.save
    end
end

这是正确的做法吗?假设对于给定的ProfilePaymentAccountUser始终存在。

1 个答案:

答案 0 :(得分:1)

如果在保存before_save时出现问题,你最好不要使用after_commit而不是Profile,你不会想要这两个保存PaymentAccount但由于任何原因导致配置文件回滚时,记录不同步。更不用说,另一个额外的好处是两个更新都将在同一个db事务中发生。

另外,你得到方法#ready?免费ActiveRecord,所以你不妨使用它而不是编写一个基本上只是别名的方法。

类似于:

class PaymentAccount < ActiveRecord::Base
  before_save :update_profile

  private

  def update_profile
    profile.payment_ready = ready?
    profile.save
  end
end