我们有两个具有相同字段的模型我知道这不是最好的DB设计,但它是这样设置的,这已经存在了一段时间。
型号:User
和Stakeholder
常见属性:first_name
和last_name
关系:Stakeholder
属于User
,User has_many :stakeholders
属于
因此,我希望listen
对具有类似属性first_name
和last_name
的用户模型和利益相关者模型进行任何更改
我看过的几件事:
=> after_save
=> Observer class
轨道4中的观察员已被移除。
知道了这一点,就不应该使用Observer来设计任何新的东西。
因此,after_save
回调似乎是最好的解决方案。
然而,如果您有这种可能性,我建议进行重构,以停止这种数据重复。
删除Stakeholder
模型中的first_name
和last_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的值的两倍?