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)查询而对于其他模型和组合则反之亦然。