Ruby on rails 如何从Rails 5.1上的模型中销毁嵌套对象
我在订单上有一个嵌套的对象项。 每一份订单都有许多项目 我在订单模型上有一个setter实例方法要处理(从订单视图中创建、更新、删除?项) 我想在“编辑订单”视图中的项目数量更新为0时删除项目 到目前为止,我可以使用编辑订单上的_destroy:复选框删除该项目。但我宁愿在数量为0时销毁它 订单型号:Ruby on rails 如何从Rails 5.1上的模型中销毁嵌套对象,ruby-on-rails,model,nested,Ruby On Rails,Model,Nested,我在订单上有一个嵌套的对象项。 每一份订单都有许多项目 我在订单模型上有一个setter实例方法要处理(从订单视图中创建、更新、删除?项) 我想在“编辑订单”视图中的项目数量更新为0时删除项目 到目前为止,我可以使用编辑订单上的_destroy:复选框删除该项目。但我宁愿在数量为0时销毁它 订单型号: class Order < ApplicationRecord has_many :items, autosave: true accepts_nested_attributes_f
class Order < ApplicationRecord
has_many :items, autosave: true
accepts_nested_attributes_for :items, allow_destroy: true
end
结束
这是在销毁项目后显示错误时的服务器回滚调用
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
有什么想法吗?谢谢大家! 这样试试。我没有考虑任何缺点,但这是可行的:
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
不起作用。可能您正在某个地方重定向到最近销毁的对象。您可以将您的控制器添加到问题中吗?我更新了问题,并添加了更新订单的订单控制器。它重定向到Show Order视图,我不知道为什么它仍在查找最近删除的项目。也许我需要在控制器上进行不同的处理?再次感谢@SebastianPalma I还添加了服务器上的回滚调用,显示它正在尝试加载已删除的项目。可能有帮助。是否将\u destroy
作为嵌套参数发送不起作用?它正在使用\u destroy工作,但在将数量更新为0时,我被要求删除它,而不是复选框。在删除之前,我需要在更新到0时执行另一个操作。感谢您为我指出了正确的方向!在订单更新时,我将项目的数量更新为0,然后在订单模型上使用after_Update:destroy_if_Qty_为零,这样它将删除数量为0的项目。
elsif item[:id].present? && item[:qty].to_i <= 0
order_item = self.items.find item[:id]
order_item.destroy
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
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
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