我想在Ruby on Rails应用程序中创建一个User
模型。
我使用以下命令:
rails generate model User email:string name:string role:string
可以使用此命令将email
定义为主键吗?或者我必须修改使用此命令创建的数据库迁移文件?怎么样?
答案 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
没有工作)...
答案 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
但是,据我所知,除手动之外,仍然没有办法更改主键列的名称。