虚拟值total_price保存为1而不是总价格编号

时间:2012-04-18 21:58:14

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

total_price中所有产品的{p> cart未按预期保存。它总是显示1,无论实际总价是多少。安装money gemgoogle_currency gem后出现此问题,因此我可以根据不仅选择货币的区域设置更改产品的价格。

因此总价格总是1,但与此同时我在购物过程中屏幕上显示的金额显示正确的数字,我的意思是如果我选择2个价格为A和B的商品,那么在购物车中(在屏幕上)我有正确的total_price = A + B ..比这更重要的是,当我在填写信用卡字段后按下创建订单时,ActiveMerchant将数据发送到paypal以及进入的USD数量paypal是我在购物车A + B中的total_price ..

问题是:为什么应用程序采取正确的total_price并将其发送到paypal,但同时无法将此total_price存储在数据库中创建,它会节省1个。

当我创建订单

时,控制台会说什么
   (0.1ms)  BEGIN
  SQL (0.4ms)  INSERT INTO `orders` (`card_expires_on`, `card_type`, `cart_id`, `created_at`, `first_name`, `ip_address`, `last_name`, `total`, `updated_at`, `user_id`) VALUES ('2012-04-01', 'visa', 5, '2012-04-18 21:35:38', 'Rosca', '127.0.0.1', 'Sergiu', 1, '2012-04-18 21:35:38', 7)

order_transaction 详细信息:

SQL (0.5ms)  INSERT INTO `order_transactions` (`action`, `amount`, `authorization`, `created_at`, `message`, `order_id`, `params`, `success`, `updated_at`) VALUES ('purchase', 1, '0GT41652PP785722H', '2012-04-18 21:35:46', 'Success', 5, '--- \nbuild: \"2764190\"\nAck: Success\ntimestamp: \"2012-04-18T21:35:45Z\"\nTransactionID: 0GT41652PP785722H\namount: \"42.00\"\namount_currency_id: USD\ntransaction_id: 0GT41652PP785722H\nack: Success\nBuild: \"2764190\"\navs_code: X\nversion: \"62.0\"\nTimestamp: \"2012-04-18T21:35:45Z\"\nCorrelationID: 690aa904db3c\nAmount: \"42.00\"\nAVSCode: X\nVersion: \"62.0\"\ncvv2_code: M\nCVV2Code: M\ncorrelation_id: 690aa904db3c\n', 1, '2012-04-18 21:35:46')

有关订单创建方式的一些细节:

orders_controller.rb

  def create
    @order = current_cart.build_order(params[:order])
    @order.user_id = current_user.id
    @order.total = current_cart.total_price
#    raise current_cart.total_price.inspect
    @order.line_items = current_cart.line_items
    @order.ip_address = request.remote_ip
    if @order.save
      if @order.purchase
        Cart.destroy(session[:cart_id])
        session[:cart_id] = nil
      else
        render :action => "failure"
      end
        respond_to do |format|
          format.html { redirect_to products_path, :notice => 
          'Thank you for your order.' }
          format.json { render :json => @order }
        end
    else
       render :action => 'new'
    end
  end

注意如果我在控制器中激活提升检查线我

#<Money cents:4200 currency:USD>错误,在这种情况下,4200是2个所选产品的total_price。 42.00美元。 这是另一个证据,即total_price公式可以正常工作,直到应用程序需要将其存储在数据库中。

总价

total_price cart.rb line_item.rb

组成

line_item.rb

  belongs_to :order
  belongs_to :product
  belongs_to :cart
  belongs_to :user

  def total_price
    product.price * quantity
  end

cart.rb

has_many :line_items#, :dependent => :destroy
  has_one :order

  def to_s
    id
  end

  def add_product(product_id)
    current_item = line_items.find_by_product_id(product_id)
    if current_item
      current_item.quantity += 1
    else
      current_item = line_items.build(:product_id => product_id)
    end
    current_item
  end

  def total_price
    line_items.to_a.sum { |item| item.total_price }
  end

修改

数据库中的order.total字段类型现在是整数(11),但我尝试使用小数(10,0)以美分存储价格,但无论如何它都没有用,我的总价格总是1USD。 products的价格是十进制(10,0)。

非常大谢谢帮助..对于未来的开发人员可能会有用。

您可能需要的任何其他信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

好吧,我将order.total的字段从decimal更改为float类型,现在工作正常。我有适当的金额发送到paypal,以及为用户创建的订单中的正确金额。在使用money gem之前,它与decimal字段类型配合良好。