2014-01-08 88 views
0

我有一个Order/LineItem类型的应用程序,它将一个Order及其关联的行项目插入到数据库中。订单创建后(after_create),然后我调用一个函数来更新订单表中的总计字段。但是,当它运行时,它也会对所有行项目运行更新查询,并且由于paper_trail对update更新有效,所以它也会插入新版本。问题是,可能有数百个订单项(迄今为止最大的是872个),所以显然这不是非常优化,并且由于纸质记录,我们会得到不必要的版本。更新父级更新时停止子级模型

我看了看:触摸符号,但这似乎只能工作的孩子>父母,而不是父母>孩子。

当更新父项时,是否有办法阻止订单项上的更新被触发?

这里是浓缩的控制器/型号。

OrdersController:

class OrdersController < ApplicationController 

def create 
    @order = Order.new(order_params) 

    if @order.save 
     render :json => @order, :serializer => ::OrderSerializer 
    end 
end 

订单型号:

class Order < ActiveRecord::Base 
    has_paper_trail 
    belongs_to :customer 
    has_many :line_items, :dependent => :destroy 

    after_create :update_total_quantities 

    accepts_nested_attributes_for :line_items 

    def update_total_quantities 
     update_attributes({:total_quantity => calculated_total_quantity}) 
    end 
end 

的LineItem模型:

INSERT INTO "line_items" ("colour", "created_at", "order_id", "price", "product_id", "quantity", "size", "updated_at", "variant_id") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING "id"[0m [["colour", 2], ["created_at", Wed, 08 Jan 2014 11:47:38 UTC +00:00], ["order_id", 1216], ["price", 77.0], ["product_id", 241702], ["quantity", 1], ["size", "18"], ["updated_at", Wed, 08 Jan 2014 11:47:38 UTC+00:00], ["variant_id", "241702_2_18"] 
INSERT INTO "line_items" ("colour", "created_at", "order_id", "price", "product_id", "quantity", "size", "updated_at", "variant_id") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING "id" [["colour", 106], ["created_at", Wed, 08 Jan 2014 11:47:38 UTC +00:00], ["order_id", 1216], ["price", 20.0], ["product_id", 2753], ["quantity", 1], ["size", "18"], ["updated_at", Wed, 08 Jan 2014 11:47:38 UTC +00:00], ["variant_id", "2753_106_18"] 

UPDATE "orders" SET "total_quantity" = $1, "updated_at" = $2 WHERE "orders"."id" = 1216 [["total_quantity", 878], ["updated_at", Wed, 08 Jan 2014 11:47:40 UTC +00:00] 
UPDATE "line_items" SET "created_at" = $1, "updated_at" = $2 WHERE "line_items"."id" = 108533 [["created_at", Wed, 08 Jan 2014 11:47:38 UTC +00:00], ["updated_at", Wed, 08 Jan 2014 11:47:38 UTC +00:00] 
UPDATE "line_items" SET "created_at" = $1, "updated_at" = $2 WHERE "line_items"."id" = 108526[0m [["created_at", Wed, 08 Jan 2014 11:47:38 UTC +00:00], ["updated_at", Wed, 08 Jan 2014 11:47:38 UTC +00:00 
:从日志问题的

class LineItem < ActiveRecord::Base 
    has_paper_trail :on => [:update, :destroy] 

    belongs_to :order 
end 

实施例

+0

灿您发布“calculated_total_quantity”方法? – omarvelous

+0

我设法通过更改工作流程来解决该问题,如下面的答案中所示。 – SteveA

回答

0

我通过更改工作流程逻辑来解决此问题。相反,创建后运行update_total_quantities方法,我跑在控制器的方法来代替,所以我更新的代码看起来更像是:

OrdersController:

class OrdersController < ApplicationController 

def create 
    @order = Order.new(order_params) 
    @order.total_quantity = @order.calculated_total_quantity 

    if @order.save 
    render :json => @order, :serializer => ::OrderSerializer 
    end 
end 

订货型号:

class Order < ActiveRecord::Base 
    has_paper_trail 

    belongs_to :customer 
    has_many :line_items, :dependent => :destroy 

    accepts_nested_attributes_for :line_items 

end