残念ながら、を使用せずにそれを行うことは不可能であると判断しました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
これは、指定されたタイプの名前で列を作成するだけ:primary_key
です。これは、標準のデータベースアダプタでは次のように設定されています。
PostgreSQL: "serial primary key"
MySQL: "int(11) DEFAULT NULL auto_increment PRIMARY KEY"
SQLite: "INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL"
回避策
これらを主キータイプとして使用execute
しているため、整数ではない主キーを作成するために使用する必要があります(PostgreSQLのserial
はシーケンスを使用した整数です)。
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