Rails,包含一个或多个零件项目模型引用的产品模型

时间:2018-12-04 13:51:33

标签: ruby-on-rails ruby

关于包含多个零件的产品模型;

...例如;

Product (Car)
 Part (Engine) x1
 part (Wheel) x4
 part (Chassis) x1

我正在努力解决这个问题,希望能对您有所帮助。在我的产品模型中,我假设我设置了:

has_many :parts

执行此操作时,虽然只能为每个产品分配一个零件,但不能指定数值?您将如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

在您的情况下,一辆汽车有很多零件,而一部分属于一辆汽车。可以如下设置:

class Car < ApplicationRecord
  has_many :parts
end

class Part < ApplicationRecord
  belongs_to :car
end

这假设零件模型有一个称为car_id的列,该列用于指定零件所属的汽车。然后,您可以执行以下操作:

car.parts
part.car

编辑:

说我们有5个部分:

part1 = Part.find(1)
part2 = Part.find(2)
part3 = Part.find(3)
part4 = Part.find(4)
part5 = Part.find(5)

还有一种产品:

product1 = Product.find(1)

如果我想分配属于该产品的零件,我会这样做:

part1.product_id = product1.id
part1.save

我可以对全部5个部分执行此操作,这会将它们全部分配给父产品。

如果要查看哪些零件属于产品,可以执行以下操作:

product1.parts

这将返回

[part1, part2, part3, part4, part5]

以及

part1.product

哪个将退回product1

答案 1 :(得分:1)

要在产品和零件之间创建多对多关联,您需要一个联接表:

class Product < ApplicationRecord
  has_many :product_parts
  has_many :parts, through: :product_parts
end

class Part < ApplicationRecord
  has_many :product_parts
  has_many :products, through: :product_parts
end

class ProductPart < ApplicationRecord
  belongs_to :product
  belongs_to :part
end

此处product_parts用作联接表。例如,您可以通过以下方式将四个车轮连接到汽车上:

car = Product.create(name: 'Car')
wheel = Part.create(name: 'Wheel')
4.times { car.parts << wheel }
car.parts.count # => 4
car.parts
# => #<ActiveRecord::Associations::CollectionProxy [#<Part id: 1, name: "Wheel", created_at: "2018-12-06 15:12:18", updated_at: "2018-12-06 15:12:18">, #<Part id: 1, name: "Wheel", created_at: "2018-12-06 15:12:18", updated_at: "2018-12-06 15:12:18">, #<Part id: 1, name: "Wheel", created_at: "2018-12-06 15:12:18", updated_at: "2018-12-06 15:12:18">, #<Part id: 1, name: "Wheel", created_at: "2018-12-06 15:12:18", updated_at: "2018-12-06 15:12:18">]>

这将在product_parts表中创建4行。解决此问题的另一种方法是在product_parts表中添加数量列。

car.product_parts.create(part: wheel, quantity: 4)

仅在显式创建联接模型时才可以向联接模型添加“元数据”。请注意,这实际上不会像上一个示例那样更改关联的数量和长度。

car.parts.count # => 1 
car.parts
# => #<ActiveRecord::Associations::CollectionProxy [#<Part id: 1, name: "Wheel", created_at: "2018-12-06 15:12:18", updated_at: "2018-12-06 15:12:18">]>

相反,您必须使用联接表记录来获取数量:

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Quantity</th>
    </tr>
  </thead>
  <tbody>
    <% @product.product_parts.each do |pp| %>
    <tr>
      <td><%= pp.part.name %></td>
      <td><%= pp.quanty %></td>
    </tr>
    <% end %>
  </tbody>
</table>