2

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

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

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

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

4

2 回答 2

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.

于 2015-05-04T21:29:59.823 回答
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
于 2015-05-25T00:17:13.293 回答