rails3 bigint主键

我想在Rails 3下创建一个bigint (或string或任何非int )键入的主键字段。

我有一个给定的数据结构,例如:

 things ------ id bigint primary_key name char(32) 

我目前正试图推动的方法:

 create_table :things, :id => false do |t| # That prevents the creation of (id int) PK t.integer :id, :limit => 8 # That makes the column type bigint t.string :name, :limit => 32 t.primary_key :id # This is perfectly ignored :-( end 

列类型是正确的,但主键选项不会出现在sqlite3中,我怀疑这也是MySQL的情况。

不久前我自己就找到了答案: 使用Rails,如何将主键设置为不是整数类型的列?

您需要设置primary_key:false,然后在执行迁移之前使用自定义语句。

编辑1:您需要检查数据库文档以查找要执行的确切查询。 它作为常规SQL语句执行,需要特定于数据库。 我提到的问题中的例子是Postgre SQL。 如果您使用的是MySQL,则可能需要更改它。

我有同样的问题。 我觉得桌子最简单的方法

 accounts id bigint primary key name char 

 create_table :accounts do |t| t.string :name end change_column :accounts, :id , "bigint NOT NULL AUTO_INCREMENT" 

对于MySQL,您可以使用“SERIAL”,它是“BIGINT UNSIGNED NOT NULL AUTO_INCREMENT”的别名

 class ChangeUserIdToBigint < ActiveRecord::Migration def change change_column :users, :id, 'SERIAL' end end 

skalogirou的答案很好,但更改不会反映在schema.rb中。 因此db:schema:loaddb:test:clone类的任务不会创建相同的DB结构。

所需的解决方法是增强db:schema:load和db:test:clone rake任务,如下所述: http : //www.lshift.net/blog/2013/09/30/changing-the-primary-key-type -in-的Ruby-on-Rails的模型/

这是我基于该解决方法使用的内容:

 namespace :my_app do namespace :db do task :after_schema_load_and_db_test_clone => :environment do puts 'Changing primary key for :my_table' query = 'ALTER TABLE  CHANGE id id bigint DEFAULT NULL auto_increment' ActiveRecord::Base.connection.execute(query) end end Rake::Task['db:schema:load'].enhance do ::Rake::Task['my_app:db:after_schema_load_and_db_test_clone'].invoke end Rake::Task['db:test:clone'].enhance do ::Rake::Task['my_app:db:after_schema_load_and_db_test_clone'].invoke end 

如果要转换Postgres中的所有表,则需要运行此代码

 class ConvertIntToBigint < ActiveRecord::Migration[5.1] def up query = <<-SQL SELECT tablename AS "tablename" FROM pg_tables WHERE schemaname = 'public'; SQL connection.execute(query).each do |element| if column_exists?(element['tablename'], :id, :integer) change_table(element['tablename']) {|t| t.change :id, :bigint } end end end def down end end