我正在处理订单输入模块:
订单has_many OrderLines
一切正常,除非我在底部添加一行来更新订单上的缓存总数,这会使创建的订单行加倍。
a)我知道这不是交易,无论有没有这种情况都会发生 b)我知道它与我应用于订单的“sub_total_ordered”方法无关,因为我设置了100的设定速率,它仍然这样做。 c)Order或OrderLines上没有过滤器之前或之后。
有什么想法吗?
编辑* - 我尝试将@ order.save移动到OrderLine after_save过滤器并且问题消失了,但我仍然想知道导致这种情况的原因。
def create
@order = Order.find(params[:order_id])
OrderLine.transaction do
params[:order_lines].each do |i, values|
# If an orderline for the sku already exists find it and update, otherwise initialize it
ol = @order.order_lines.find_or_initialize_by_style_number(values[:style_number], values)
# If its a new record and the qty_ordered is > 0 apply the order id then save it, otherwise delete it.
if ol.new_record? && values[:qty_ordered].to_i > 0
ol.order_id = @order.id
ol.save!
# If updating an existing order line and the qty_ordered is > 0 update it, otherwise delete it.
else
if values[:qty_ordered].to_i < 1
ol.destroy
else
ol.update_attributes(values)
end
end
end
end
# Update the cached_sub_total on the Order
@order.cached_sub_total = @order.sub_total_ordered
@order.save
redirect_to order_path(@order)
end
这是输出(底部4行是您可以看到再次插入订单行的地方。
Order Load (0.2ms) SELECT `orders`.* FROM `orders` WHERE `orders`.`id` = 1 LIMIT 1
(0.0ms) BEGIN
OrderLine Load (0.3ms) SELECT `order_lines`.* FROM `order_lines` WHERE `order_lines`.`order_id` = 1 AND `order_lines`.`style_number` = 'F121' LIMIT 1
CACHE (0.0ms) SELECT `order_lines`.* FROM `order_lines` WHERE `order_lines`.`order_id` = 1 AND `order_lines`.`style_number` = 'F121' LIMIT 1
Sku Load (0.2ms) SELECT `skus`.* FROM `skus` WHERE `skus`.`sku_number` = 'F121' LIMIT 1
(0.2ms) UPDATE `skus` SET `qty_on_order` = 161, `updated_at` = '2012-03-20 02:56:01' WHERE `skus`.`id` = 1
SQL (0.1ms) INSERT INTO `order_lines` (`colour`, `created_at`, `order_id`, `price`, `product_size`, `qty_ordered`, `qty_shipped`, `style_number`, `updated_at`) VALUES ('Black Suede', '2012-03-20 02:56:01', 1, 10, NULL, 9, NULL, 'F121', '2012-03-20 02:56:01')
OrderLine Load (0.1ms) SELECT `order_lines`.* FROM `order_lines` WHERE `order_lines`.`order_id` = 1 AND `order_lines`.`style_number` = 'F122' LIMIT 1
CACHE (0.0ms) SELECT `order_lines`.* FROM `order_lines` WHERE `order_lines`.`order_id` = 1 AND `order_lines`.`style_number` = 'F122' LIMIT 1
Sku Load (0.1ms) SELECT `skus`.* FROM `skus` WHERE `skus`.`sku_number` = 'F122' LIMIT 1
(0.1ms) UPDATE `skus` SET `qty_on_order` = 172, `updated_at` = '2012-03-20 02:56:01' WHERE `skus`.`id` = 2
SQL (0.1ms) INSERT INTO `order_lines` (`colour`, `created_at`, `order_id`, `price`, `product_size`, `qty_ordered`, `qty_shipped`, `style_number`, `updated_at`) VALUES ('Grey Suede', '2012-03-20 02:56:01', 1, 10, NULL, 9, NULL, 'F122', '2012-03-20 02:56:01')
(0.4ms) COMMIT
(0.2ms) SELECT SUM((ol.qty_ordered * ol.price)) AS sum_id FROM order_lines ol WHERE (ol.order_id = 1)
(0.0ms) BEGIN
SQL (0.2ms) INSERT INTO `order_lines` (`colour`, `created_at`, `order_id`, `price`, `product_size`, `qty_ordered`, `qty_shipped`, `style_number`, `updated_at`) VALUES ('Black Suede', '2012-03-20 02:56:01', 1, 10, NULL, 9, NULL, 'F121', '2012-03-20 02:56:01')
SQL (0.1ms) INSERT INTO `order_lines` (`colour`, `created_at`, `order_id`, `price`, `product_size`, `qty_ordered`, `qty_shipped`, `style_number`, `updated_at`) VALUES ('Grey Suede', '2012-03-20 02:56:01', 1, 10, NULL, 9, NULL, 'F122', '2012-03-20 02:56:01')
(0.4ms) COMMIT