0

我有一个订单、地址和用户模型。一个订单可以有一个帐单和一个送货地址。一个用户可以有多个保存的地址。对所有事情都使用地址模型是有意义的。我关心的是订单和帐单/送货地址的关系。

我不确定这是否可以与多态关联一起使用。

class Order
  has_one :billing_address,  as: :addressable, polymorphic: true
  has_one :shipping_address, as: :addressable, polymorphic: true
end

class User
  has_many :addresses, as: :addressable, polymorphic: true
end

class Address
  belongs_to :addressable, polymorphic: true
end

我是否正确建模?人们通常如何在 Rails 中解决这个问题?

我可以将它反转到 Orderbelongs_to :billing_address和的位置shipping_address,但这意味着user_id在 Address 模型中有一个冗余。

4

3 回答 3

0

:billing_address 和 :shipping_address 将具有相同的外键类型 Order 所以你会遇到问题。

有一个很好的堆栈溢出问题可以解决类似的问题......最佳答案表明您可能想要使用不同的技术(即不是多态关联)

为什么在多态关联中不能有外键?

我在理解他的“超类”解决方案时遇到了一些麻烦,但“逆转关系”的提议似乎很干净,很容易实现

于 2013-07-24T16:39:28.147 回答
0

我不会在这里使用多态关联。相反,给你的Address模型一个字段,表明它是什么类型的地址;并为您的Order模型提供两个具有相同类但条件不同的字段:

class Order < ActiveRecord::Base
  has_one :billing_address, :class => "Address", :conditions => "addr_type = 'billing'"
  has_one :shipping_address, :class => "Address", :conditions => "addr_type = 'shipping'"
end

class User < ActiveRecord::Base
  has_many :addresses
end

class Address < ActiveRecord::Base
  belongs_to :order
  belongs_to :user
end
于 2013-07-24T16:23:34.807 回答
0

您还需要将单表继承添加到组合中。使用 BillingAddress 和 ShippingAddress 子类化 Address 并适当地调整 Order 模型关联,你应该没问题。

一定要测试的东西。有(或曾经)一些奇怪的情况,多态+ sti 返回错误的表类型。我的记忆是,您可能还需要一个用户可以拥有的 MailingAddress,以免拥有任何顶级地址。

于 2013-07-24T16:17:03.097 回答