不幸的是,我确定如果不使用,是不可能做到的execute
。
为什么它不起作用
通过检查ActiveRecord源,我们可以找到以下代码create_table
:
在schema_statements.rb
:
def create_table(table_name, options={})
...
table_definition.primary_key(options[:primary_key] || Base.get_primary_key(table_name.to_s.singularize)) unless options[:id] == false
...
end
因此,我们可以看到,当您尝试在create_table
选项中指定主键时,它将创建具有指定名称的主键(如果未指定,则创建主键id
)。它通过调用您可以将表的定义块中使用相同的方法:primary_key
。
在schema_statements.rb
:
def primary_key(name)
column(name, :primary_key)
end
这只会创建具有指定名称type的列:primary_key
。在标准数据库适配器中将其设置为以下内容:
PostgreSQL: "serial primary key"
MySQL: "int(11) DEFAULT NULL auto_increment PRIMARY KEY"
SQLite: "INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL"
解决方法
由于我们将这些作为主键类型,因此必须使用它execute
来创建不是整数的主键(PostgreSQLserial
是使用序列的整数):
create_table :employees, {:id => false} do |t|
t.string :emp_id
t.string :first_name
t.string :last_name
end
execute "ALTER TABLE employees ADD PRIMARY KEY (emp_id);"
正如Sean McCleary所述,您的ActiveRecord模型应使用set_primary_key
以下命令设置主键:
class Employee < ActiveRecord::Base
set_primary_key :emp_id
...
end