【问题标题】:Are these relationships good candidates for a polymorphic association?这些关系是多态关联的良好候选者吗?
【发布时间】:2013-07-24 16:11:25
【问题描述】:

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

我不确定这是否适用于多态关联。

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 中解决这个问题?

我可以在 Order belongs_to :billing_address 和 shipping_address 的位置颠倒这个顺序,但这意味着在地址模型中有一个多余的 user_id。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

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

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

    【讨论】:

    • 我认为不可能将 STI 与多态关联一起使用?
    • 不确定。我承认自从我完成它已经很长时间了(也许是 Rails 2?),但它当时奏效了。如果上述方法有效,则两者都需要。应该很容易看出它是否不再是一种选择。
    • 干杯!抱歉,没有足够的代表 +1!
    【解决方案2】:

    我不会在这里使用多态关联。相反,给你的 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
    

    【讨论】:

    • 出于好奇,为什么这比拥有 STI、has_one :belling_addres, as: :addressable, class_name: 'BillingAddress' 并重复收货地址和用户更好?
    • 另外,这不会在地址表中创建一个多余的user_id 字段吗?当地址属于订单而不是用户时,例如...
    • @user2615384 - 我想没有理由不使用 STI 而不是这种方法,尽管如果两个地址在代码中的行为完全相同,那么这似乎有点多余。不过,这两种方式都不需要多态性。您的第二点也是正确的,但不会打扰我个人。当地址属于订单时,user_id 就是 null。
    【解决方案3】:

    :billing_address 和 :shipping_address 将具有相同的外键类型 Order,因此您会遇到问题。

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

    Why can you not have a foreign key in a polymorphic association?

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

    【讨论】:

    • 感谢分享这个问题。太棒了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2015-06-22
    • 2023-03-04
    • 2022-10-21
    • 2011-12-18
    • 1970-01-01
    相关资源
    最近更新 更多