Ruby on rails 如何从Rails 5.1上的模型中销毁嵌套对象

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

我在订单上有一个嵌套的对象项。 每一份订单都有许多项目

我在订单模型上有一个setter实例方法要处理(从订单视图中创建、更新、删除?项)

我想在“编辑订单”视图中的项目数量更新为0时删除项目

到目前为止,我可以使用编辑订单上的_destroy:复选框删除该项目。但我宁愿在数量为0时销毁它

订单型号:

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