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? }
Это должно сделать свое дело.