Tur*_*rgs 19 postgresql activerecord ruby-on-rails
更新:这是关于Rails 4.x并不是Rails 5中的问题.
我有一个Number模型,其中一个number字段是bigint.该schema.rb文件正确地在数据库中创建表结构.

但是,使用该应用程序时,当我创建一个新的数字时,我收到一条错误消息:
/
Error 71731224865的RangeError 超出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


更新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控制台查看它认为列是什么数据类型,它表示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字段.我的希望很高.不幸的是,没有雪茄.保存值时出现相同的错误.
尝试
t.column :number, :bigint
请参阅: Rails 迁移:PostgreSQL 上的 Bigint 似乎失败了?