输入大额美元值到rails money对象

时间:2015-05-04 21:24:40

标签: ruby-on-rails postgresql ruby-on-rails-4 money-rails

我已经构建了一个运行rails 4.1和ruby 1.9.3的应用程序,它使用money-rails gem。当我将大量美元值输入表单字段并将其保存到我的PG数据库时,我遇到了一个问题。错误如下:

PG::NumericValueOutOfRange: ERROR: value "9900000000" is out of range for type integer

PG docs显示整数的最大值为+2147483647。我希望能够使用money-rails gem,但能够输入更大的数字。

就解决方案而言,我理解PG中的列类型应该是一个bigint,但我并不知道如何启用money-rails来支持将数字存储为bigint而不是整数。

2 个答案:

答案 0 :(得分:3)

money-rails README中,它显示您可以将其配置为使用其他数据类型:

# Default ActiveRecord migration configuration values for columns:
#
# config.amount_column = { prefix: '',           # column name prefix
#                          postfix: '_cents',    # column name  postfix
#                          column_name: nil,     # full column name (overrides prefix, postfix and accessor name)
#                          type: :integer,       # column type
#                          present: true,        # column will be created
#                          null: false,          # other options will be treated as column options
#                          default: 0
#                        }

注意有一个type: :integer选项。尝试将其更改为:bigint

答案 1 :(得分:1)

我最近遇到了类似的问题(使用ruby 2.0& rails 4.1)。唯一需要的是创建迁移以支持8字节整数,即bigint:

 change_column :order_items, :unit_price_cents, :integer, :limit => 8 

它刚刚起作用。我的情况我需要支持4位小数,所以我不得不重新创建美元货币如下:

MoneyRails.configure do |config|
  config.register_currency = {
     :priority            => 1,
     :iso_code            => "USD",
     :iso_numeric         => "840",
     :name                => "United States Dollar with subunit of 4 digits",
     :symbol              => "$",
     :symbol_first        => true,
     :subunit             => "Subcent",
     :subunit_to_unit     => 10000,
     :separator           => ".",
     :delimiter           => ","
  }
end