Postgres Rails Adapter认为Bigint / Varchar是Integer - 保存时会导致异常

时间:2015-04-22 02:17:44

标签: ruby-on-rails postgresql activerecord

更新:这是关于Rails 4.x并且在Rails 5中不是问题。

我有一个Number模型,number字段为bigintschema.rb文件正确地在数据库中创建表结构。

Postgres numbers schema

然而,使用该应用程序时,当我创建一个新的数字时,我收到一条错误消息:

  

RangeError at / numbers
  71731224865超出了ActiveRecord :: ConnectionAdapters :: PostgreSQL :: OID :: Integer的限制范围4

为什么这个数字字段仍然被视为标准整数而不是bigint?

这似乎与StackOverflow上的其他“超出范围”错误不同,因为它们似乎都无法在数据库中首先将字段定义为bigint。但是,我已经得到了......这似乎是“拯救”适配器吓坏了。

这是schema.rb中出现的create_table:

create_table "numbers", id: false, force: :cascade do |t|
  t.bigint   "number",           null: false, index: {name: "index_numbers_on_number", unique: true}
  t.string   "formatted_number"
  t.text     "description"
  t.integer  "user_id",          null: false, index: {name: "index_numbers_on_userid"}, foreign_key: {name: 'fk_numbers_user_id'}
  t.datetime "created_at",       null: false
  t.datetime "updated_at",       null: false
end

Create number image
Stacktrace

更新1:我已将该列重新创建为DECIMAL(11,0),希望这是一个临时的解决方法,但也会因同样的错误而失败!也许我作为解决方法的唯一选择是VARCHAR(11)。

更新2:好的。奇怪的是 正在继续。我现在已经将该字段定义为VARCHAR(11),因此我可以继续进行工作......但是也会因同样的错误而失败。什么?

更新3:可能是因为number表中的numbers字段是主键吗?我没有使用id作为关键,我已经覆盖了它。并不是说我试图将该字段用作VARCHAR,因此PostgreSQLAdaptor仍然显示... is out of range for ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer with limit 4错误的原因毫无意义。

如果有帮助,这是我的Number模型:

class Number < AbstractModel
  belongs_to :user
  has_many :extensions

  self.primary_key = 'number'
  validates :number, numericality: { only_integer: true, greater_than_or_equal_to: 611, less_than_or_equal_to: 61999999999 }, presence: true, uniqueness: true
  validates :user_id, presence: true
end

更新4:使用 Rails控制台查看data type it thinks the columns是什么,并说它是INTEGER!格儿。 sql_type 确实返回BIGINT。什么?

Loading development environment (Rails 4.2.1)
irb(main):001:0> Number.column_for_attribute('number').type
  => :integer
irb(main):002:0> Number.column_for_attribute('number').sql_type
  => "bigint"
irb(main):003:0> quit

确保数据库仍按预期设置:

[turgs@web123 myapp]$ psql -h 127.0.0.1 -p 5432
psql (9.1.15)

db=> \d numbers
                   Table "public.numbers"
      Column      |            Type             | Modifiers 
------------------+-----------------------------+-----------
 number           | bigint                      | not null
 formatted_number | character varying           | 
 description      | text                        | 
 user_id          | integer                     | not null
 max_extn_length  | integer                     | 
 created_at       | timestamp without time zone | not null
 updated_at       | timestamp without time zone | not null
Indexes:
    "index_numbers_on_number" UNIQUE, btree (number)
    "index_numbers_on_userid" btree (user_id)
Referenced by:
    TABLE "extensions" CONSTRAINT "fk_extensions_number_id" FOREIGN KEY (number_id) REFERENCES numbers(number)

db=> 

更新5:是.... 另一个更新!这次我以为我会落在我的剑上并尝试每个人在其他帖子中使用的东西,他们无法在数据库中首先创建BIGINT。所以,我改为schema.rb为:

    create_table "numbers", id: false, force: :cascade do |t|
  t.integer  "number", limit: 8, null: false, index: {name: "index_numbers_on_number", unique: true}
  t.string   "formatted_number"
  t.text     "description"
  t.integer  "user_id", null: false, index: {name: "index_numbers_on_userid"}, foreign_key: {name: 'fk_numbers_user_id'}
  t.integer  "max_extn_length"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

请注意t.integer "number", limit: 8。令人惊讶的是,DID仍然在数据库中创建了一个bigint字段。我的希望很高。不幸的是,没有雪茄。保存值时出现相同的错误。

2 个答案:

答案 0 :(得分:1)

尝试

t.column :number, :bigint

见: Rails Migration: Bigint on PostgreSQL seems to be failing?

答案 1 :(得分:0)

create_table :numbers do |t|
  t.bigint :mynumber

  t.timestamps
end

我试过上面的迁移它适用于以下长度的数字

7173122486511111111

我认为该版本存在问题 请更新你的postgres / rails版本