如何从Rails 5.1模型中销毁嵌套对象

时间:2018-07-20 23:25:36

标签: ruby-on-rails model nested

我在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

有什么想法吗?谢谢!

1 个答案:

答案 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