0

У нас есть две модели, которые имеют одинаковые поля. Я знаю, что это не лучший дизайн DB, но он был настроен таким образом, и вот он вот-вот ненадолго.Что является самым простым способом синхронизации изменений модели? Rails


Модели: User и Stakeholder

Общие атрибуты: first_name и last_name

Отношения: Stakeholder belongs_to User и User has_many :stakeholders


Так что я смотрю на listen на любые изменения в модели пользователя и модели заинтересованных сторон, которые имеют аналогичные атрибуты first_name и last_name

Несколько вещей, которые я посмотрел на:

=> after_save 
=> Observer class 

ответ

1

Observers have been removed in rails 4.
Зная это, вы не должны проектировать ничего нового с помощью наблюдателей.

Обратный вызов after_save кажется поэтому лучшим решением.

Однако, если у вас есть такая возможность, я бы рекомендовал рефакторинг, чтобы прекратить дублирование данных.

Удалите поля first_name и last_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.

+0

Rocking! .......... –

+1

Использование 'after_commit' может быть предпочтительным, так как обратный вызов не вызывается до совершения транзакции db. В случае с запуском ограничений базы данных 'after_save' будет вызван для записи, которая не будет сохранена. –

0

Да. Вы можете реализовать hook после_захвата для прослушивания любых изменений в модели User and Stakeholder.

Поскольку вы поддерживали отношения между пользователем и заинтересованным лицом, вы можете получить имя_имени и last_name из таблицы пользователя для конкретной записи участника. Почему вы сохраняете их в два раза одинаковыми значениями для полей first_name и last_name, которые хотите сохранить?

+0

Исторически .. –

Смежные вопросы