【问题标题】:Ruby on Rails ignoring integer limitRuby on Rails 忽略整数限制
【发布时间】:2016-01-24 08:42:12
【问题描述】:

我需要使用一个 64 位整数的外部来源 id 来索引用户表。 Rails 完全有能力存储这样一个数字,除非它看起来是主键。我有以下迁移:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users, :id => false do |t|
      t.integer :id, limit: 8
      t.string :name

      t.timestamps null: false
    end
  end
end

迁移工作正常,没有报告错误,但是当我尝试使用 64 位整数对其进行播种时,我被告知:

RangeError: 76561198054432981 is out of range for ActiveRecord::Type::Integer with limit 4

Rails 显然忽略了 limit 字段,只要它是主键/ :id 字段?我应该如何处理这个问题?

值得我使用 sqlite3(默认),但据我所知,sqlite 完全能够存储 64 位整数。

这是来自 sqlite 的 table_info:

0|id|integer(8)|0||0
1|name|varchar|0||0
2|created_at|datetime|1||0
3|updated_at|datetime|1||0

【问题讨论】:

  • 你确定这不是 SQLite 问题吗? jakegoulding.com/blog/2011/02/06/sqlite-64-bit-integers
  • @CristianoBetta 我不相信,我尝试以不同的名称添加具有相同规格的另一列,效果很好。根据 pragma table_info 两者的定义方式相同。
  • 我在 PostgreSQL 上有一个类似的问题。数据库声明该列是bigint,列元数据声明限制为8,但我得到out of range for ActiveModel::Type::Integer with limit 4的错误

标签: ruby-on-rails ruby sqlite


【解决方案1】:

你给的极限值是正确的;它对应于BIGINT 类型 确保应用您的迁移;在某些 CLI 或 GUI 软件中打开数据库并验证 col-type

补充: 在迁移中更改列的长度或数据类型将使该列作为主键无效。相反,创建一个覆盖站点默认主键数据类型的初始化程序应该提供您希望实现的行为:

# config/initializers/change_primary_key_datatype.rb
require 'active_record/connection_adapters/postgresql_adapter'
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "bigserial primary key"

这就是我们要为PG 数据库做的事情;这是可能的,因为


但是在SQLite 的代码库中有

【讨论】:

  • 我删除了数据库,运行了迁移,尝试播种,但错误仍然存​​在。 sqlite 显示正确和预期的 :limit。
  • 所以没有与驱动程序无关的方法来更改主键的大小?
  • 当您可以轻松粘贴文本(并链接到the documentation)时,为什么还要包含文本的屏幕截图?
  • @muistooshort :: 我需要突出显示几个词,所以我认为这样会更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 2010-09-15
  • 2011-05-05
  • 1970-01-01
  • 2019-01-20
  • 2010-12-18
相关资源
最近更新 更多