【问题标题】:generate a model with a string field as primary key生成带有字符串字段作为主键的模型
【发布时间】:2016-01-01 19:37:21
【问题描述】:
我想在我的 Ruby on Rails 应用程序中创建一个 User 模型。
我使用以下命令:
rails generate model User email:string name:string role:string
是否可以使用此命令将email 定义为主键?或者我必须修改使用此命令创建的数据库迁移文件?怎么做?
【问题讨论】:
标签:
ruby-on-rails
model
rails-activerecord
primary-key
【解决方案1】:
不,你不能。默认情况下,主键是一个自增整数。
但是,您可以打开从该命令生成的迁移并更改它(在运行 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|
【解决方案2】:
要添加到@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 不起作用)...
【解决方案3】:
在 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
【解决方案4】:
在最新版本的 ActiveRecord 中,您可以使用--primary-key-type 在生成命令中指定主键类型:
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
但是,据我所知,除了手动之外,仍然无法更改主键列的名称。