У меня есть вложенный объект Item on Order. В каждом Заказе много предметов.
У меня есть метод экземпляра установщика в модели заказа для обработки (создание, обновление, удаление? Элементы из представлений заказа).
Я хотел бы удалить элемент, когда количество предметов обновится до 0 в представлении «Изменить порядок».
Пока я могу удалить элемент с помощью флажка _destroy: в форме редактирования заказа. Но я бы предпочел уничтожить его, когда количество равно 0.
Модель заказа:
class Order < ApplicationRecord
has_many :items, autosave: true
accepts_nested_attributes_for :items, allow_destroy: true
end
Модель товара:
class Item < ApplicationRecord
belongs_to :order
end
Я пробовал разными способами удалить элемент, когда количество равно 0.
1) Сначала я попытался использовать метод mark_for_destruction, но он обновил порядок, и элемент остался бы там с тем же количеством. Это экземпляр метода установки, который будет выполнять эту задачу:
elsif item[:id].present? && item[:qty].to_i <= 0
order_item = self.items.find item[:id]
order_item.mark_for_destruction
2) Я пытался уничтожить его напрямую с помощью .destroy, но затем он выдает: Не удалось найти товар с ID = 308 для заказа с ID = 112 при перезагрузке представления шоу после действия обновления ...
elsif item[:id].present? && item[:qty].to_i <= 0
order_item = self.items.find item[:id]
order_item.destroy
Это вызываемый метод Update в контроллере заказов.
def update
respond_to do |format|
if @order.update(order_params)
format.html { redirect_to [:admin, @customer, @order], notice: "Order was successfully updated." }
format.json { render :show, status: :ok, location: [:admin, @customer, @order] }
else
format.html { render :edit }
format.json { render json: @order.errors, status: :unprocessable_entity }
end
end
конец
Это вызов сервера ROLLBACK, когда он показал ошибку после уничтожения элемента.
SQL (0.3ms) DELETE FROM "items" WHERE "items"."id" = $1 [["id",308]]
Item Load (0.3ms) SELECT "items".* FROM "items" WHERE
"items"."order_id" = $1 AND "items"."id" = 308 [["order_id", 112]]
(0.2ms) ROLLBACK
Есть предположения? Спасибо!
Я обновил вопрос и добавил контроллер заказов, который обновляет заказ. Он перенаправляется в представление «Показать порядок», я не знаю, почему он все еще ищет недавно удаленный элемент. Может надо на контроллере по другому обрабатывать? Еще раз спасибо!
@SebastianPalma Я также добавил вызов ROLLBACK на сервере, который показывает, что он пытается загрузить удаленный элемент. Может, это поможет.
отправка _destroy как вложенного параметра не работает?
Он работает с использованием _destroy, но меня попросили удалить его при обновлении количества до 0 вместо флажка. Мне нужно выполнить другое действие при обновлении до 0 перед его удалением.





Попробуйте так. Минусов не считал, но работает:
class Item < ApplicationRecord
belongs_to :order
after_update :destroy_if_qty_is_zero
private
def destroy_if_qty_is_zero
self.destroy if quantity == 0
end
end
Попробуйте использовать Item.find(id).destroy, если self.destroy не работает.
Спасибо, что указали мне правильное направление! Я закончил тем, что обновил количество элементов до 0 в момент обновления заказа, затем я закончил использовать after_update: destroy_if_qty_is_zero в модели заказа, чтобы он удалил элементы, у которых было 0 как количество.
Возможно, вы перенаправляете куда-то на недавно уничтоженный объект. Можете ли вы добавить к вопросу ваш контроллер / ы?