У меня есть форма заказа с ограничениями на количество элементов, которые вы можете выбрать, которая принимает вложенные атрибуты, и я хотел бы выполнить create
и update
для связанных элементов при обновлении заказа.
Моя форма выглядит следующим образом:
<%= simple_form_for @food_order do |f| %>
<% @food_order.order_items.each do |oi| %>
<%= f.fields_for :order_items, oi do |oi_form| %>
<%= oi_form.input :quantity %>
<% end -%>
<% end -%>
<% end -%>
Мой валидатор выглядит так:
# OrderItem.rb
validate :food_order_quantity
def food_order_quantity
if (order.limit - order.order_items.sum(:quantity)) < self.quantity
errors.add(:base, "Too many products. Please update your cart.")
end
end
Давайте представим, что я создаю заказ с ограничением в 10 пунктов и выбираю 10 элементов:
food_order = FoodOrder.create(limit: 10)
order_item_1 = OrderItem.create(order: food_order, quantity: 10)
Если я пытаюсь обновить заказ, уменьшив количество order_item_1
на 1 и добавив новый order_item
с количеством 1, я получаю сообщение об ошибке, даже если общее количество верно:
order_item_1.quantity = 9
order_item_2 = OrderItem.new(order: food_order, quantity: 1)
put client_food_order_path(@client, food_order), params: {
food_order: {
id: food_order.id,
order_items_attributes: [
order_item_1.attributes,
order_item_2.attributes,
]
}
}
# returns the following error
@messages={:"order_items.base"=>["Too many products. Please update your cart."]}
Я понимаю, что пытается сохранить order_item_2
перед обновлением order_item_1
, и в это время контроллер считает, что имеется 11 элементов (просто потому, что order_item_1
еще не обновлено).
Что я могу сделать, чтобы разрешить такую операцию?