Rails, Модель продукта, содержащая одну или несколько ссылок на модель изделия. - PullRequest
0 голосов
/ 04 декабря 2018

Относительно модели продукта, в которой размещены несколько элементов детали;

... например;

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

Я пытаюсь обернуть голову вокруг настройки этого инекоторая помощь будет оценена.В моей модели продукта я предполагаю, что настроил:

has_many :parts

Когда я делаю это, хотя я могу назначить только одну деталь для каждого продукта и не могу указать числовое значение?Как бы вы подошли к этой проблеме?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Чтобы создать связь «многие ко многим» между продуктом и деталью, вам нужна таблица соединения:

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>
0 голосов
/ 04 декабря 2018

В вашем случае автомобиль состоит из множества частей, а часть принадлежит одному автомобилю.Это можно настроить следующим образом:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...