Ruby on rails 同步模型更改的最简单方法是什么?轨道
我们有两个具有相同字段的模型我知道这不是最好的DB设计,但是它是以这种方式设置的,这已经存在一段时间了Ruby on rails 同步模型更改的最简单方法是什么?轨道,ruby-on-rails,ruby,database,ruby-on-rails-3,database-design,Ruby On Rails,Ruby,Database,Ruby On Rails 3,Database Design,我们有两个具有相同字段的模型我知道这不是最好的DB设计,但是它是以这种方式设置的,这已经存在一段时间了 模型:用户和利益相关者 常见属性:first\u name和last\u name 关系:干系人属于用户,并且用户有很多干系人 因此,我希望倾听用户模型和利益相关者模型中具有类似属性的任何更改名字和姓氏 我看了几件事: => after_save => Observer class 对。您可以在保存钩子后实现,以监听用户和涉众模型中的任何更改 由于维护了用户和干系人之间的关系
模型:
用户
和利益相关者
常见属性:first\u name
和last\u name
关系:干系人
属于用户
,并且用户有很多干系人
因此,我希望
倾听用户模型和利益相关者模型中具有类似属性的任何更改名字和姓氏
我看了几件事:
=> after_save
=> Observer class
对。您可以在保存钩子后实现,以监听用户和涉众模型中的任何更改
由于维护了用户和干系人之间的关系,您可以从用户表中检索特定干系人记录的名字和姓氏。为什么要为要存储的字段first\u name和last\u name保留两倍相同的值?
知道了这一点,就不应该使用观察者设计任何新的东西
因此,保存后的回调似乎是最好的解决方案
但是,如果您有这种可能性,我建议您进行重构,以停止这种数据重复
删除干系人
模型中的名字
和姓氏
字段。
并将这些值委托给用户
class Stakeholder < ActiveRecord::Base
delegate :first_name, to: :user
delegate :last_name, to: :user
end
执行涉众.new.first\u name='John'
将更改用户模型中的值。
但是,它不适用于update\u attributes
。在提交后使用可能更可取,因为在提交db事务之前不会调用回调。在触发数据库约束的情况下,将为不保存的记录调用保存后的。
class Stakeholder < ActiveRecord::Base
delegate :first_name=, to: :user
delegate :last_name=, to: :user
end