关于包含多个零件的产品模型;
...例如;
Product (Car)
Part (Engine) x1
part (Wheel) x4
part (Chassis) x1
我正在努力解决这个问题,希望能对您有所帮助。在我的产品模型中,我假设我设置了:
has_many :parts
执行此操作时,虽然只能为每个产品分配一个零件,但不能指定数值?您将如何解决这个问题?
答案 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>