【问题标题】:What is the easiest way to synchronise model changes? Rails同步模型更改的最简单方法是什么?导轨
【发布时间】:2013-07-20 23:16:51
【问题描述】:

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


型号:UserStakeholder

常用属性:first_namelast_name

关系:Stakeholderbelongs_to UserUser has_many :stakeholders


因此,我希望 listen 对具有相似属性的用户模型和利益相关者模型 first_namelast_name 进行任何更改

我看过的几件事:

=> after_save
=> Observer class

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 使用after_commit 可能更可取,因为在提交数据库事务之前不会调用回调。在触发数据库约束的情况下,将调用 after_save 以获取不会保存的记录。
    【解决方案2】:

    是的。你可以实现 after_save 钩子来监听用户和利益相关者模型的任何变化。

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

    【讨论】:

      猜你喜欢
      • 2013-04-06
      • 2018-12-19
      • 2012-02-06
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      相关资源
      最近更新 更多