我已经构建了一个运行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而不是整数。
答案 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