0

好的,所以我有三個不同的對象:一個人,一個地方和一個設備。每個人都可以擁有一個地址,在大多數情況下可以有多個地址和多個電話號所以我的想法是創建具體的對象表,有一個地址和一個電話表。這裏我的問題:RnR:數據庫規範化,導軌模型和關聯

因此,通常,在我的SQL世界中,我只需在地址和電話表中添​​加一個object_id列,並在對象id列中放置一個對象的id,然後選擇所有地址或電話記錄匹配。

我可以做到這一點,做find_by_sql並獲取記錄,但我寧願留在ActiveRecord範例。那麼這是否意味着我應該在表格中爲每個對象設置一個id列,以便person_id,place_id等。

什麼是對此進行建模的「正確」方式?

回答

1

您可以創建的ActiveRecord多態關聯,這樣你就可以添加object_idobject_type的地址和PHONE_NUMBERS表,並指定這樣的關聯:

class Address 
    belongs_to :object, :polymorphic => true 
end 

class PhoneNumber 
    belongs_to :object, :polymorphic => true 
end 

class Person 
    has_many :addresses, :as => :object 
    has_many :phone_numbers, :as => :object 
end 

class Place 
    has_many :addresses, :as => :object 
    has_many :phone_numbers, :as => :object 
end 

class Equipment 
    has_many :addresses, :as => :object 
    has_many :phone_numbers, :as => :object 
end 

這樣,Person.first.addresses應該運行像Addresses.where(:object_type => "Person", :object_id => Person.first.id)查詢而對於其他模型和組合則反之亦然。