好的,所以我有三个不同的对象:一个人,一个地方和一个设备。每个都可以有一个地址,大多数情况下有多个地址和多个电话号码。所以我的想法是创建特定的对象表,有一个地址和一个电话表。我的问题在这里:
通常,在我的SQL世界中,我只在地址和电话表中有一个object_id列,并在对象id列中放置对象的id,然后选择匹配的所有地址或电话记录。
我可以做到这一点,做find_by_sql并获取记录,但我宁愿留在ActiveRecord范例内。那么这是否意味着我应该在表中为每个对象都有一个id列,所以person_id,place_id等等。
对此进行建模的“正确”方法是什么?
答案 0 :(得分:1)
您可以使用activerecord创建多态关联,因此您可以将object_id
和object_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)
之类的查询,反之亦然。其他模型和关联。