2013-07-22 103 views
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

歷史... –

相關問題