Order、Product 和 OrdersProduct 模型关联

Order, Product and OrdersProduct models associations

我正在构建一个 rails 应用程序,我需要在其中使用产品和订单模型。

我认为逻辑路径是有另一个模型,称为 OrdersProduct,因为一个订单可以有许多要订购的产品,我在其中放了一个 product_idorder_id(匹配两个其他型号)和一个 amount 字段。

嗯,我的问题是如何从我的 OrdersProduct 记录中访问每个产品信息?

关键是我可以在我的 OrdersProduct 模型中做一个 belongs_to :product 关联,但是在我的 Product 中放置一个 has_many :orders_products 没有任何意义型号。

模型看起来像这样:

class Customer < ActiveRecord::Base
  # id
  # name
  # etc…
end

class Product < ActiveRecord::Base
  # id
  # name
  # etc…
end

class Order < ActiveRecord::Base
  # id
  # customer_id
  # etc…
end

class OrdersProduct < ActiveRecord::Base
  # order_id
  # product_id
  # amount
end

访问 Order.products 并获取与 OrdersProduct 模型相关的产品集合的最佳方式是什么?

你想要的是使用Has and belongs to many through关联。

class Order < ActiveRecord::Base
  has_many :orders_products
  has_many :products, through: :orders_products
end

class Product < ActiveRecord::Base
  has_many :orders_products
  has_many :orders, through: :orders_products
end

class OrdersProduct < ActiveRecord::Base
  belongs_to :order
  belongs_to :product
end

现在在商业术语中,订购的产品通常被称为 LineItem,因此您可以指定 line_items table 而不是使用 orders_products table。 =16=]

class Order < ActiveRecord::Base
  has_many :line_items
  has_many :products, through: :line_items
end

class Product < ActiveRecord::Base
  has_many :line_items
  has_many :orders, through: :line_items
end

class LineItem < ActiveRecord::Base
  belongs_to :order
  belongs_to :product
end

您可以删除 OrdersProduct 模型。

只需要以下型号:

class Customer < ActiveRecord::Base
  has_many :orders
  # id
  # name
  # etc…
end

class Order < ActiveRecord::Base
  belongs_to :customer
  has_many :products

  # id
  # customer_id
  # etc…
end

class Product < ActiveRecord::Base
  belongs_to :order

  # id
  # name
  # order_id
  # etc…
end

现在您可以调用 customer.orders.first.productsorder.products,因为 customerorder 是实例。