我正在摆弄rails并试图为练习目的构建一个小应用程序:
我希望客户订购一种或多种产品
我有一个client
表,一个product
表,最后一个order
表格有client_id
和product_id
现在,我不太确定如何在这些表之间建立良好的关系:客户进入产品页面,选择产品并保存订单。
对于哪种模型应该具有哪种关系的任何帮助都非常感谢。
答案 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
列,例如订单:
#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
我建议你选择第二个选项,因为你有一个中间模型。