0

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


型号:UserStakeholder

共同属性:first_namelast_name

关系:Stakeholderbelongs_toUserUser has_many :stakeholders


所以我正在寻找listen具有相似属性的用户模型和利益相关者模型的任何first_name变化last_name

我看过的几件事:

=> after_save
=> Observer class
4

2 回答 2

1

在 rails 4 中移除了观察者
知道了这一点,你不应该使用观察者设计任何新东西。

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

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

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

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

于 2013-07-22T09:33:38.467 回答
0

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

由于您维护了用户和利益相关者之间的关系,您可以从用户表中检索特定利益相关者记录的名字和姓氏。为什么要将它们保留为要存储的字段 first_name 和 last_name 的相同值的两倍?

于 2013-07-22T09:33:12.747 回答