Rails / MySQL - 保存订单总数是订单项的两倍

时间:2012-03-20 03:08:33

标签: mysql ruby-on-rails

我正在处理订单输入模块:

订单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

0 个答案:

没有答案