我有两个模型,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_address
创建User
,它将自动设置为contact_address
,因为addresses
表未指定其他resource_type
(都是User
)。
你能就我应该如何设置我的模型给我一些建议吗?
由于
答案 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
会更有意义吗?