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



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

例如

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

我正在努力设置它,如果能提供一些帮助,我将不胜感激。在我的产品模型中,我假设我设置了一个:

has_many :parts

当我这样做的时候,我只能为每个产品分配一个零件,而且我不能指定数值?你将如何处理这个问题?

在您的案例中,一辆车有许多零件,而一个零件属于一辆车。这可以设置如下:

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

哪个将返回产品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

这里CCD_ 1用作联接表。例如,您可以通过以下方式将四个车轮连接到汽车上:

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>

最新更新