如何更改ActiveRecord的ID的(默认)类型? int不够长,我宁愿长。我很惊讶没有:迁移的时间长了 - 是否只使用一些小数?如何在Rails应用程序中使用long id?
回答
贷http://moeffju.net/blog/using-bigint-columns-in-rails-migrations
class CreateDemo < ActiveRecord::Migration
def self.up
create_table :demo, :id => false do |t|
t.integer :id, :limit => 8
end
end
end
- 查看哪些禁止自动创建id字段
- 的选项
:id => false
的t.integer :id, :limit => 8
线将产生64位整数字段
根据Rails的API文档,类型可能的选项是:
:string
:text
:integer
:float
:decimal
:datetime
:timestamp
:time
:date
:binary
:boolean
您可以使用:小数,或者如果你需要,你可以直接执行命令:
class MyMigration
def self.up
execute "ALTER TABLE my_table ADD id LONG"
end
end
正如wappos指出的那样,您可以使用如下的辅助选项:limit来告诉ActiveRecord您希望列的大小。所以你可以使用带有更大的限制的:int列。
由于Rails会自动将其设置为主键,因此很难对其进行迁移。
以后,您可以更改任何列是这样的:
change_column :foobars, :something_id, 'bigint'
您可以在初始指定迁移的非主ID作为自定义类型是这样的:
create_table :tweets do |t|
t.column :twitter_id, 'bigint'
t.column :twitter_in_reply_to_status_id, 'bigint'
end
我哪里有“ bigint“,你可以把你的数据库用于你要使用的数据库列类型的任何文本(例如”unsigned long“)。
如果您需要您的id列是bigint,最简单的方法是创建表,然后使用change_column更改同一迁移中的列。
使用PostgreSQL和SQLite,模式更改是原子性的,因此如果迁移失败,这不会使数据库处于奇怪状态。有了MySQL,你需要更加小心。
谢谢 - 它似乎是一个“正常”列使用限制=> 8会做的伎俩,但对于primary_key这不起作用。对于MySQL我现在使用自定义SQL执行。宁愿change_column,但不会有与初始创建相同的问题,即:主键列不支持limit => 8。 – 2009-07-01 16:08:05
不,您可以使用change_column与主键,如下所示:change_column:foobars,:id,“bigint”。所以你要创建表格,然后立即将ID列更改为bigint。我仍然不认为使用:使用int列的限制将会起作用(无论如何使用MySQL),因为无论如何,int的最大大小都是2 ** 31-1。 – 2009-07-01 23:45:44
好吧,我只是在Rails文档中查看它,如果你做t.column:foobar,:int,:limit => 8,你会得到一个bigint。 – 2009-07-02 07:29:14
要设置默认主键列类型,迁移文件不是混乱的地方。
相反,只要坚持这种在底部你config/environment.rb
ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"
而且所有的表应该与预期的列类型来创建用于id
:
+--------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
你做了以后有什么你已经开始做...下一个问题可能是“我如何使我的外键列是相同的列类型?”因为主键people.id
为bigint(20) unsigned
和person_id
为int(11)
或其他什么是没有意义的?
对于这些列,您可以参考其他建议,例如,
t.column :author_id, 'BIGINT UNSIGNED'
t.integer :author_id, :limit => 8
UPDATE:@Notinlist,使用任意列对任意表的主键,你需要做的create_table-change_column
舞蹈:
create_table(:users) do |t|
# column definitions here..
end
change_column :users, :id, :float # or some other column type
例如如果我想,而不是自动递增的整数,
create_table(:users, :primary_key => 'guid') do |t|
# column definitions here..
end
change_column :users, :guid, :string, :limit => 36
这是一种很有用的方法,但是有什么办法可以使这个数据库无关或者只是为了这个需要而付出的代价? – brokenbeatnik 2011-02-02 01:21:52
Rails 3中,MySQL的:
t.column :foobar, :int, :limit => 8
不给我一个BIGINT,只是一个int。然而,
t.column :twitter_id, 'bigint'
工作正常。 (虽然它确实把我绑到MySQL。)
借用其他解决方案,根据最近为我工作的内容进行调整。
添加到config/initializers
的文件中。它声明了一个新的列类型(改编自chookeat的建议)。使用长ID
ActiveRecord::ConnectionAdapters::Mysql2Adapter::NATIVE_DATABASE_TYPES[:long_primary_key] = "BIGINT(20) DEFAULT NULL auto_increment PRIMARY KEY"
迁移是这样:
create_table :notification_logs, :id => false do |t|
t.column :id, :long_primary_key
# ...
end
如果有人需要这个PostgreSQL的工作,创建这样一个初始化:
# config/initializers/bigint_primary_keys.rb
ActiveRecord::Base.establish_connection
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:primary_key] = 'bigserial primary key'
由于在您建立数据库连接之前,不需要在Rails 3.2(甚至更早的版本)中延迟加载,ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
。
我写了一个名为activerecord-native_db_types_override的gem,它允许您更改将在您的迁移中使用的数据类型。
在你的Gemfile,添加:
gem 'activerecord-native_db_types_override'
然后到config/environment.rb,使用长IDS Postgres里,添加:
NativeDbTypesOverride.configure({
postgres: {
primary_key: { name: "bigserial primary key"}
}
})
看到它README长达最新信息。
更正如何更改默认primary key
列类型:
相反的:
ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"
你应该做的:
ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT(8) UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"
,否则你将无法添加foreign key
数据库层的限制。
在rails4
,你可以做到这一点。
下面是创建rails4
& postgres
一个Dummy
模型为例,
xxx_migrate_dummies.rb:
class CreateDummies < ActiveRecord::Migration
def change
create_table :dummies, :id => false do |t|
t.column :id, :serial8, primary_key: true
t.string :name, :limit => 50, null: false
t.integer :size, null: false
t.column :create_date, :timestamptz, null: false
end
end
end
它做什么:
- 它使用
serial8
如id类型,它是64位整数,并将其定义为primary key
。 - 它使用
timestamptz
作为日期时间类型,其中包含时区信息,这对跨越多个时区的应用程序很重要。
你可以这样说:
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users, id: :bigserial do |t|
t.string :name
end
end
end
- 1. Id在rails应用程序中
- 2. 在Rails应用程序中编码ID
- 3. 如何在Ruby on Rails应用程序中标记id:?
- 4. 在RAILS应用程序中使用JavaScripts
- 5. 在Rails应用程序中使用Nokogiri
- 6. 如何在简单的Rails应用程序中使用JQuery datepicker?
- 7. 如何在使用JQueryMobile的Rails应用程序中禁用AJAX
- 8. 如何在Rails 3.0应用程序中使用Twitter中的Bootstrap?
- 9. 如何使用angularjs在rails应用程序中初始化kinvey
- 10. 如何在d3.js Rails应用程序中使用json
- 11. 如何在rails应用程序中使用jquery自动完成
- 12. 如何计算在Rails应用程序
- 13. Lat Long在Windows Mobile 6应用程序
- 14. 如何在Rails应用程序
- 15. 如何在Rails 3应用程序中使用Sencha Touch 2?
- 16. 如何在Rails MySQL应用程序中使用json列类型?
- 17. 如何在Rails应用程序中使用SQL_ASCII编码?
- 18. 如何在rails应用程序中使用ruby的CSS?
- 19. 如何在Rails应用程序中使用ES6(ES2015)?
- 20. 如何在Ruby on Rails应用程序中使用JQuery Mobile
- 21. 如何在rails应用程序中强制使用gem版本?
- 22. 如何在Rails应用程序中使用磁盘配额?
- 23. 如何在rails 3.1应用程序中使用Less?
- 24. 如何在Rails应用程序中使用Google输入工具?
- 25. 如何在Rails 3.1应用程序中使用REST API?
- 26. 如何在Rails应用程序中使用HTML模板
- 27. 如何在rails应用程序中使用js.erb
- 28. 如何在Rails应用程序中使用哟MYOB
- 29. 如何在我的rails 3.1+应用程序中使用PHP类?
- 30. 如何在现有的Rails应用程序中使用gRPC
“作为wappos指出的那样,你可以使用辅助选项,如:极限告诉ActiveRecord的,你要多大的列是如此,你会使用:具有较大限制的int列。“ 我不认为这将工作,如果他想要的大于整数将成立。设置较大的限制不会更改最大大小。实际上: – 2009-07-01 06:01:33
:primary_key没有:limit选项,所以这对主键列不起作用。 – 2009-07-01 16:05:57
我只是在Rails文档中查看它,如果使用:limit => 8,则会得到一个bigint。我没有意识到这一点。 – 2009-07-02 07:30:20