1

我有两个模型,Address并且User

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_addressUser会自动设置为contact_address,因为addresses表没有指定不同的resource_type(两者都是User)。你能给我一些关于我应该如何设置我的模型的建议吗?

谢谢

4

3 回答 3

0

单表继承可以帮助你。要使其工作,您必须通过迁移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会更有意义?

于 2013-07-15T23:48:52.847 回答
0

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

has_one :contact_address, class_name: "Address", as: :resource, foreign_key: :foreign_key
于 2012-10-25T20:17:36.200 回答
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
于 2012-10-24T17:23:27.763 回答