多个has_one关联到一个多态模型

时间:2012-10-24 13:59:13

标签: ruby database ruby-on-rails-3 database-design activerecord

我有两个模型,AddressUser

class Address < ActiveRecord::Base
  belongs_to :resource, polymorphic: true
end

class User < ActiveRecord::Base
  has_one :contact_address, class_name: "Address", as: :resource
  has_one :billing_address, class_name: "Address", as: :resource
end

问题是如果我为billing_address创建User,它将自动设置为contact_address,因为addresses表未指定其他resource_type (都是User)。 你能就我应该如何设置我的模型给我一些建议吗?

由于

3 个答案:

答案 0 :(得分:0)

我会说帐单邮寄地址更多地与订单相关而不是人。例如,在一个订单上,我可能希望您在工作时向我收费,另一个在家里收费。

此外,一个人可以有很多地址,但一个地址也可以有很多人。它是一个网络,而不是一个层次结构。经典表示:

PARTY
id
type
name

PARTY_ADDRESS
id
party_id
address_id
type {home, work}

ADDRESS
id
suite
...

ORDER
id
date
customer_party_address_id
bill_to_party_address_id

ORDER_ITEM
id
order_id
product_id
price
quantity
ship_to_party_address_id

答案 1 :(得分:0)

我选择了简单的方法,为addresses表添加了另一个foreign_key。之后:

has_one :contact_address, class_name: "Address", as: :resource, foreign_key: :foreign_key

答案 2 :(得分:0)

Single table inheritance可以帮到你。要使其工作,您必须通过迁移向type表添加locations列(与所有单表继承模型一样)。

class Address < ActiveRecord::Base
  belongs_to :resource, polymorphic: true
end

class ContactAddress < Address
end

class BillingAddress < Address
end

class User < ActiveRecord::Base
  has_one :contact_address, as: :resource
  has_one :billing_address, as: :resource
end

对于它的价值,belongs_to关系名称(:resource)有点奇怪。也许:addressable会更有意义吗?