Rails将一列与多个相同类型的对象相关联

时间:2018-01-28 04:22:21

标签: ruby-on-rails ruby

在我的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,是否有“预建”方式关联订单和产品?

3 个答案:

答案 0 :(得分:2)

您应该在productsorders之间创建一个联接表,我们会将其称为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