RnR:数据库规范化,rails模型和关联

时间:2012-07-26 15:44:03

标签: ruby-on-rails-3 activerecord rails-migrations model-associations

好的,所以我有三个不同的对象:一个人,一个地方和一个设备。每个都可以有一个地址,大多数情况下有多个地址和多个电话号码。所以我的想法是创建特定的对象表,有一个地址和一个电话表。我的问题在这里:

通常,在我的SQL世界中,我只在地址和电话表中有一个object_id列,并在对象id列中放置对象的id,然后选择匹配的所有地址或电话记录。

我可以做到这一点,做find_by_sql并获取记录,但我宁愿留在ActiveRecord范例内。那么这是否意味着我应该在表中为每个对象都有一个id列,所以person_id,place_id等等。

对此进行建模的“正确”方法是什么?

1 个答案:

答案 0 :(得分: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)之类的查询,反之亦然。其他模型和关联。