生成一个以字符串字段为主键的模型

时间:2016-01-01 19:37:22

标签: ruby-on-rails model rails-activerecord primary-key

我想在Ruby on Rails应用程序中创建一个User模型。

我使用以下命令:

rails generate model User email:string name:string role:string

可以使用此命令将email定义为主键吗?或者我必须修改使用此命令创建的数据库迁移文件?怎么样?

4 个答案:

答案 0 :(得分:8)

不,你不能。默认情况下,主键是一个自动增量整数。

但是,您可以打开从命令生成的迁移,并更改它(在运行rake db:migrate命令之前)。迁移可能会有create_table命令:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      # ...
    end
  end
end

如果您阅读create_table文档,您会发现可以通过两个选项。具体而言,您需要将:id设置为false以不生成id字段,并且您需要指定主键字段的名称。

    create_table :users, id: false, primary_key: :email do |t|

答案 1 :(得分:5)

要添加到@Simone Carletti的答案,可能需要使用execute来设置primary key(如果它是

class CreateUsers < ActiveRecord::Migration
   def change
      create_table :users, id: false do |t|
         t.string :email, null: false
         t.timestamps
      end
      execute "ALTER TABLE users ADD PRIMARY KEY (email);"
   end
end

我们在某些应用中使用了uuid,这就是我们必须做的事情(primary_key: :uuid没有工作)...

enter image description here

答案 2 :(得分:1)

在Migration 6.0或Rails 6中

class CreateUsers < ActiveRecord::Migration[6.0]
   def change
       create_table :users, id: false do |t|
           t.string :email, null: false, primary_key: true
           t.timestamps
       end
   end
end

答案 3 :(得分:0)

在最新版本的ActiveRecord中,您可以使用--primary-key-type在generate命令中指定主键类型:

rails generate model User email:string --primary-key-type=string

产生迁移:

class CreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users, id: :string do |t|
      t.string :email

      t.timestamps
    end
  end
end

但是,据我所知,除手动之外,仍然没有办法更改主键列的名称。