在我的Rails应用程序中,我有一个用户,产品和订单表。用户可以按订单生成多个产品。发生这种情况时,我将项目作为字符串存储在订单表的列(product_id)中。例如,如果用户购买了3种不同的产品,则产品ID将存储在我的订单表的product_id列中:product_id: "12, 97, 132"
。
我将用户与订单相关联,例如用户has_many :orders
和订单belongs_to :user
。对于每个用户,我想要做的是显示他们之前的订单以及属于该订单的产品。通过这些关联,我可以轻松获得订单:@orders = current_user.orders.all
但是有没有办法将产品与订单相关联,因为如果多个产品可以与一个订单相关联?
现在,在我的订单模型中,我添加了一个attr_accessor :products
,在我的控制器中我有:
def orders
@orders = current_user.orders.all
@orders.each do |order|
items = Product.find(order.product_id.split(','))
order.products = items
end
end
这是有效的,但如果参考列中存储了多个产品ID,是否有“预建”方式关联订单和产品?
答案 0 :(得分:2)
您应该在products
和orders
之间创建一个联接表,我们会将其称为line_items
。
## app/models/product.rb
class Product < ApplicationRecord
has_many :line_items
has_many :orders, through: :line_items
end
## app/models/line_item.rb
class LineItem < ApplicationRecord
belongs_to :product
belongs_to :order
end
## app/models/order.rb
class Order < ActiveRecord::Base
has_many :line_items
has_many :products, through: :line_items
end
为了关联订单和产品,只需使用内置的has_many
,如下所示:
@order = Order.first
@order.products.count # => 0
@order.product_ids = [12, 97, 132]
@order.products.count # => 3
答案 1 :(得分:1)
如果订单has_many产品和产品has_many订单,您可以在不使用您提到的字符串表示法的情况下关联产品。那么你只需要一个引用它们的连接表。
答案 2 :(得分:1)
处理案例的更好方法是通过联接表创建产品和订单之间的多对多关系。
1 - 创建orders_products表
class CreateOrdersProducts < ActiveRecord::Migration
def change
create_table :orders_products do |t|
t.references :order, index: true
t.references :product, index: true
end
end
end
2 - 在models / order.rb
中class Order
has_and_belongs_to_many :products
end
3 - 在models / product.rb
中class Product
has_and_belongs_to_many :orders
end
创建关联后,您可以使用以下方式将产品保存到特定订单:
order.products = products
order.save
获取特定订单的产品:
order.products