好了,我有三个不同的对象:一个人,地点和设备。 每个人都可以有一个地址,在大多数情况下,多个地址和多个电话号码。 所以我的想法是创建特定对象表中,有一个地址和电话表。 在这里我的问题:
所以通常情况下,在我的SQL的世界里,我只想有地址和电话表中的object_id列,并把该对象ID列中的对象的ID,然后选择匹配的所有地址或电话记录。
我能做到这一点,做的find_by_sql并得到记录,但我宁愿呆在ActiveRecord的范式。 这是否意味着我应该在表中的每个对象的ID列,所以为person_id,place_id等。
什么是“正确”的方式来建模呢?
您可以创建的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)
并为模特和协会的其他反之亦然。