同步模型更改的最简单方法是什么?轨道



我们有两个具有相同字段的模型我知道这不是最好的DB设计,但它是这样设置的,这已经存在了一段时间。


型号:UserStakeholder

常见属性:first_namelast_name

关系:Stakeholder属于UserUser has_many :stakeholders属于


因此,我希望listen对具有类似属性first_namelast_name 的用户模型和利益相关者模型进行任何更改

我看过的几件事:

=> after_save
=> Observer class

轨道4中的观察员已被移除。
知道了这一点,就不应该使用Observer来设计任何新的东西。

因此,after_save回调似乎是最好的解决方案。

然而,如果您有这种可能性,我建议进行重构,以停止这种数据重复。

删除Stakeholder模型中的first_namelast_name字段。并将这些值委托给用户。

class Stakeholder < ActiveRecord::Base
  delegate :first_name, to: :user
  delegate :last_name,  to: :user
end

通过这种方式,您可以执行Stakeholder.new.first_name,这将在用户关系中使用first_name方法。

您可以以相同的方式委托=方法。

class Stakeholder < ActiveRecord::Base
  delegate :first_name=, to: :user
  delegate :last_name=,  to: :user
end

并且执行Stakeholder.new.first_name = 'John'将改变用户模型中的值
但它不能与update_attributes一起工作。

是。您可以实现after_save钩子来监听用户和利益相关者模型中的任何更改。

由于您维护了User和Stakeholder之间的关系,因此可以从User表中检索特定Stakeholders记录的first_name和last_name。为什么要将它们保持为要存储的字段first_name和last_name的值的两倍?

相关内容