我在Order上有一个嵌套对象Item。 每个订单都有很多物品。
我在Order模型上有一个setter实例方法要处理(从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方法,但是它将更新订单,并且该项目将以相同的数量停留在此。 这是将执行该任务的setter方法的实例:
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
这是被调用的Orders Controller上的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
有什么想法吗?谢谢!
答案 0 :(得分:1)
尝试这种方式。我没有考虑任何缺点,但是可以起作用:
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
。