RNR:数据库规范化,轨道模型和协会(RnR: Database normalization, ra

2019-11-01 00:00发布

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

所以通常情况下,在我的SQL的世界里,我只想有地址和电话表中的object_id列,并把该对象ID列中的对象的ID,然后选择匹配的所有地址或电话记录。

我能做到这一点,做的find_by_sql并得到记录,但我宁愿呆在ActiveRecord的范式。 这是否意味着我应该在表中的每个对象的ID列,所以为person_id,place_id等。

什么是“正确”的方式来建模呢?

Answer 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)并为模特和协会的其他反之亦然。



文章来源: RnR: Database normalization, rails models and associations