属于两个模型或多态关联的模型?

时间:2014-06-16 02:38:13

标签: ruby-on-rails ruby-on-rails-4 associations models

我有三个模特

  1. 用户
  2. 产品
  3. 顺序
  4. 提交user的用户product和其他用户可以order该产品。

    现在我想实现另一个模型payment,我作为管理员付钱给用户。

    问题 我对在userorderpayment之间应该创建什么样的关联感到困惑?

    这就是我目前所拥有的: 在app/models/user.rb

    class User < ActiveRecord::Base
    
      has_many :products_selling,  class_name: 'Product'
      has_many :orders_received, class_name: 'Order', through: :products_selling, source: :orders
    
      has_many :orders_made, class_name: 'Order'
      has_many :products_ordering,  class_name: 'Product', through: :orders_made, source: :product
    
      has_one :payment, class_name: 'Payment', through: :orders_received
    

    并在app/models/order.rb

    class Order < ActiveRecord::Base
        belongs_to :product
        belongs_to :buyer, class_name: 'User', foreign_key: :user_id
        has_one :seller, class_name: 'User', through: :product
    
        has_one :payment, through: :seller
    

    并在app/models/payment.rb

    class Payment < ActiveRecord::Base
      belongs_to :user
      belongs_to :order
    

    我不确定应该使用哪种关联,我一直在阅读并且有使用polymorphic: :true的示例,但它们都是has_many,在我的情况下,一个订单对应一个付款。

1 个答案:

答案 0 :(得分:5)

<强>协会

Polymorphic associations基本上允许您使用单个表来管理多个关联:

enter image description here

因此,如果您想将multiple表链接到single表,它实际上将创建一个pseudo对象,该对象可以与不同的数据类型相关联。我们通常使用与多个模型可以使用的表的多态关联,包括imageserrorsposts等示例:

enter image description here

关于将多态关联与has_many / has_one联系起来,我不完全确定(如果你愿意,我可以研究)

-

<强>修正

在你的情况下,我会这样做:

#app/models/user.rb
class User < ActiveRecord::Base

  has_many :orders
  has_many :purchases, class_name: 'Order', foreign_key: "buyer_id"

  has_many :products
  has_many :bought,  class_name: 'Product', through: :purchases

end

#app/models/order.rb
class Order < ActiveRecord::Base
   belongs_to :user
   belongs_to :product
   has_one :payment
end

#app/models/payment.rb
Class Payment < ActiveRecord::Base
   #fields - id | user_id | order_id | created_at | updated_at
   belongs_to :order #-> user pays for order
   belongs_to :user #-> user making the payment
end

这样您就可以为每个payments创建order - 这是真正付款的对象,对吧? (您需要支付order,而不是product