0

我们有两个模型具有相同的字段我知道它不是最好的数据库设计但是它已经被设置为这种方式,这是它在这里一段时间。同步模型更改的最简单方法是什么? Rails


型号:UserStakeholder

共同属性:first_namelast_name

关系:Stakeholder belongs_to的User,并User has_many :stakeholders


所以我期待listen上在用户模式和利益相关者模式,具有相似的属性first_namelast_name

几件事情的任何变化,我已经看过:

=> after_save 
=> Observer class 

回答

1

Observers have been removed in rails 4
知道这一点,你不应该设计任何新的使用观察员。因此,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一起使用。

+0

摇摆!.......... –

+1

使用'after_commit'可能是可取的,因为该数据库事务被提交之前不会调用的回调。在数据库约束触发的情况下,'after_save'将被调用一个不会被保存的记录。 –

0

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

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

+0

历史... –

相关问题