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

时间:2013-07-22 09:22:05

标签: ruby-on-rails ruby database ruby-on-rails-3 database-design

我们有两个具有相同字段的模型我知道它不是最好的数据库设计但是它已经按照这种方式进行设置而且它是'&#39 39;在这里待了一段时间。


模特:UserStakeholder

常见属性:first_namelast_name

关系:Stakeholder belongs_to UserUser has_many :stakeholders


因此,我希望listen关于具有类似属性first_namelast_name

的用户模型和利益相关方模型的任何更改

我看过几件事:

=> after_save
=> Observer class

2 个答案:

答案 0 :(得分:1)

Observers have been removed in rails 4
知道这一点,你不应该使用观察者设计任何新东西。

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

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

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

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

答案 1 :(得分:0)

是。您可以实现after_save挂钩来监听User和Stakeholder模型中的任何更改。

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