Rails Simple Form Association для всех возможных объектов

Я пытаюсь настроить simple_form для сценария продукта / корзины, но немного по-другому, чем типичный сценарий. Мой дисплей должен перечислить ВСЕ доступные продукты и иметь кол-во ввода для каждого. Когда сохранено, cart_items должен хранить cart_id, product_id, а также qty только для тех предметов, которые имеют кол-во. Если оно пустое или равно нулю, его не следует добавлять в cart_items

Корзина:

class Cart < ApplicationRecord
  has_many :cart_items
  has_many :products, through: :cart_items
  accepts_nested_attributes_for :cart_items
end

Элементы корзины:

class CartItem < ApplicationRecord
  belongs_to :cart
  belongs_to :product
end

Товары:

class Products < ApplicationRecord
  has_many :cart_items
  has_many :carts, through: :cart_items
end

Я пытаюсь, чтобы моя форма отображалась, например: [ x ] (Qty) Product Name [ x ] (Qty) Product Name [ x ] (Qty) Product Name [ x ] (Qty) Product Name

Я не уверен, как получить дополнительное поле для кол-во, используя f.association :cart_items, collection: Products.all() и я попробовал это:

<%= f.simple_fields_for :cart_items do |fa| %>
    <%= fa.association :product, as: :select %>
    <%= fa.input :qty %>
<% end %>

Но это только отображает существующие ассоциации, а также отображает продукт в списке выбора, тогда как я хотел бы просто перечислить все продукты и отобразить их количество.

Есть ли хороший и симпатичный "Rails-y" способ сделать это, что я пропускаю, или мне нужно сделать еще некоторые ручные манипуляции в моем контроллере и представлениях? Я использую Rails 5.

1 ответ

Решение

Я подозреваю, что не существует особого пути "Rails-y", или я не знаю об этом. Я думаю, что вам придется перебрать все ваши продукты и создать cart_items для отсутствующих, прежде чем тег simple_fields_for. Если элемент корзины с продуктом уже существует, просто покажите его; в противном случае сначала создайте его, а затем покажите.

Вы также должны будете добавить отклонение cart_items в случае отсутствия кол-во. Что-то вроде этого:

accepts_nested_attributes_for :cart_items, reject_if: lambda { |ci| ci[:qty].blank? || ci[:qty].zero? }

Это должно сделать свое дело.

Другие вопросы по тегам