更新:这是关于Rails 4.x并且在Rails 5中不是问题。
我有一个Number
模型,number
字段为bigint
。 schema.rb
文件正确地在数据库中创建表结构。
然而,使用该应用程序时,当我创建一个新的数字时,我收到一条错误消息:
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
更新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字段。我的希望很高。不幸的是,没有雪茄。保存值时出现相同的错误。
答案 0 :(得分:1)
答案 1 :(得分:0)
create_table :numbers do |t|
t.bigint :mynumber
t.timestamps
end
我试过上面的迁移它适用于以下长度的数字
7173122486511111111
我认为该版本存在问题 请更新你的postgres / rails版本