需要澄清has_many:通过

时间:2015-09-24 19:48:03

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

我正在尝试创建一个简单的亚马逊版本,用户可以在其中买卖产品。我有两种类型的用户:买方和卖方。我还有一个产品型号和一个订单型号。

我能够创建允许卖家创建产品以便销售它的功能,但是我很难创建买家,订单和产品之间的关联。我认为我到目前为止最接近的是:

class Product < ActiveRecord::Base

  has_many :orders

  has_many :buyers, through: :orders, foreign_key: 'buyer_id'

end

class User < ActiveRecord::Base

  has_many :orders

  has_many :bought_products, through: :orders, foreign_key: 'product_id'

end

class Order < ActiveRecord::Base

  belongs_to :buyer

  belongs_to :product

end

我认为这是最接近的原因是因为我能够进入命令行并执行:

p = Product.first
p.orders.build

然后回来:

#<Order:0x007fc76e575728> {
            :id => nil,
       :address => nil,
      :quantity => nil,
    :created_at => nil,
    :updated_at => nil,
      :buyer_id => nil,
    :product_id => 6
}

然而,当我从另一个方向来时,我没有这样的运气:

 u = User.first

#<User:0x007fc76e53f4e8> {
                 :id => 1,
               :name => "Herbert",
              :email => "h@gmail.com",
    :password_digest => "$2a$10$FqcGq.Z3bKcK2X0gDv9VS.pzw62bcy5ouSF73f3razmhwvJVuOVj6",
         :created_at => Tue, 22 Sep 2015 16:56:33 UTC +00:00,
         :updated_at => Tue, 22 Sep 2015 17:05:43 UTC +00:00
}

u.orders.build

ActiveRecord::UnknownAttributeError: unknown attribute 'user_id' for Order.

出于某种原因,它试图找到'user_id',但我认为它会寻找'buyer_id'。我不认为我对我想要建立的关系有很好的理解。如果有人能够确切地解决我出错的地方,我将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:2)

您需要修复模型:

class User < ActiveRecord::Base
  has_many :orders, class_name: 'Order', foreign_key: :buyer_id, inverse_of: :buyer
  has_many :bought_products, through: :orders, foreign_key: 'product_id', class_name: 'Product'
end

 class Order < ActiveRecord::Base
   belongs_to :buyer, class_name: 'User', inverse_of: :orders
   belongs_to :product
 end

在你的情况下产生了bug,因为Rails从给定的Order构建User,不知道User是&#34;买家&#34;对于Order

您的代码中的bought_products声明也需要明确定义class_name,而Rails无法确定&#34;已购买的产品&#34;只是产品。