客户从产品订购的协会。如何设置关系

时间:2014-05-18 08:24:11

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

我正在摆弄rails并试图为练习目的构建一个小应用程序:

我希望客户订购一种或多种产品

我有一个client表,一个product表,最后一个order表格有client_idproduct_id

现在,我不太确定如何在这些表之间建立良好的关系:客户进入产品页面,选择产品并保存订单。

对于哪种模型应该具有哪种关系的任何帮助都非常感谢。

4 个答案:

答案 0 :(得分:1)

您可以设置这样的关联

Class Client < ActiveRecord::Base

has_many :orders
has_many :products,through: :orders 

end

Class Product < ActiveRecord::Base

has_many :orders
has_many :clients,through: :orders

end

Class Order < ActiveRecord::Base

belongs_to :client
belongs_to :product

end

有关详情,请参阅 Guides

答案 1 :(得分:1)

该关联应该看起来像这样

Class Client < ActiveRecord::Base

  has_many :orders
  has_many :products,through: :orders

end

Class Product < ActiveRecord::Base

  has_many :orders
  has_many :clients,through: :orders

end

Class Order < ActiveRecord::Base

  belongs_to :client
  belongs_to :product

end

答案 2 :(得分:0)

你可以这样做:

#app/models/product.rb
has_many :orders
has_many :clients, through: :orders

#app/models/order.rb
belongs_to :client

has_many :order_products
has_many :products, through: :order_products

#app/models/client.rb
has_many :orders 
has_many :products, through: :orders

处理新order创建的方法是为其设置uuid,然后创建另一个将处理订单产品的连接模型。您可以使用order模型执行此操作,但我觉得最好描述一下基本方法,因为它会为您提供一些工作

-

uuid

我们希望为敏感数据设置uuid列,例如订单:

#migration
add_column :orders, :uuid, :varchar, after: :id

#app/models/order.rb
before_create :set_uuid

private

def set_uuid
   unless self.uuid
       loop do
           token = SecureRandom.hex(5)
           break token unless self.class.exists?(uuid: token)
       end
   end
end

这意味着每个订单都会有您想要的产品,可以这样访问:

@user.orders.first.products #-> returns order products

-

编辑 - 刚看到@Pavan's回答。对不起,如果它是相同的 - 希望它有所帮助!

答案 3 :(得分:-1)

你有两种方法

1)在客户端和产品模型之间设置has_and_belongs_to_many。

class Client < ActiveRecord::Base
  has_and_belongs_to_many :products
end

class Product < ActiveRecord::Base
  has_and_belongs_to_many :clients
end

2)通过使用关键字

设置客户端与生产之间的关系
class Client < ActiveRecord::Base
  has_many :orders
  ha_smany :products, through: orders
end

class Product < ActiveRecord::Base
  has_many :orders
  ha_smany :clients, through: orders
end

我建议你选择第二个选项,因为你有一个中间模型。