我有一张跟踪付款帐户的表PaymentAccount
。我在PaymentAccount
中有实例方法,如果付款帐户已准备就绪,则返回"例如account.is_payment_ready?
。
每次对这些记录进行更新时,我都希望在名为payment_ready
的表中使用相应的布尔值更新另一列Profile
。检索配置文件时,我希望能够account.is_payment_ready?
来减少数据库查询数量,而不是查询profile.payment_ready
。
注意PaymentAccount
和Profile
会有一对一的关联。
我的第一直觉是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
这是正确的做法吗?假设对于给定的Profile
,PaymentAccount
和User
始终存在。
答案 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