2013-07-24 43 views
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中解决这个问题?

我能反转这个地方订单belongs_to :billing_addressshipping_address,但是这意味着其在地址模型冗余user_id

回答

0

还就需要单表的传承添加到混合物。具有BillingAddress和ShippingAddress的子类地址并适当调整Order模型关联,您应该没问题。

一定要测试一下。有(或有)一些奇怪的情况,多态+ sti返回错误的表类型。我的记忆是,你可能还需要一个MailingAddress,用户可以拥有许多这样的MailingAddress,因为它没有任何顶层地址。

+0

我认为这是不可能使用STI与多态关联? –

+0

不确定。我承认,自从我完成这个任务已经很长时间了(第2条轨道可能?),但是它的确有效。如果上面的工作你需要两个。应该很容易看出它是否不再是一个选项。 –

+0

干杯!对不起,没有足够的代表+1! –

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 
+2

出于好奇,为什么这会比拥有STI,'has_one:belling_addres,as :: addressable,class_name:'BillingAddress''好,并重复发货地址和用户? –

+0

另外,这不会在地址表中创建多余的'user_id'字段吗?当地址属于一个订单,而不是一个用户,例如... –

+0

@ user2615384 - 我想没有理由不使用STI而不是这种方法,虽然如果这两个地址在代码中的行为完全相同,那么它似乎有点多余。不过,这两种方式都不需要多态。你的第二点也是如此,但并不妨碍我个人。当地址属于订单时,'user_id'简单地为'null'。 – Chowlett

0

:billing_address和:shipping_address将具有相同的外键类型的顺序,这样你会碰到一个问题。

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

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

我有一点点麻烦我的头在他的“父”的解决方案,但“反向关系”建议似乎整洁,易于implmen

+0

感谢您分享这个问题。这很棒。 –