Чтобы создать связь «многие ко многим» между продуктом и деталью, вам нужна таблица соединения:
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">]>
Это создаст 4 строки в таблице product_parts
.Другим способом решения этой проблемы является добавление столбца количества в таблицу 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>