guid
という名前のVARCHAR(25)
である主キー列を持つテーブルを作成するための移行スクリプトを作成しています。問題は、1つのステップで可能なことを達成するために2倍の努力をしなければならないと感じていることです。
私が実行した場合:
_create_table(:global_feeds, :primary_key => 'guid') do |t|
t.string :guid, :limit => 25
t.text :title
t.text :subtitle
...
t.timestamps
end
_
guid
という主キーを持つテーブルを取得します。id
という列はありません(これが必要です)。ただし、問題は、guid
列が自動インクリメントがオンになっているINT(11)
であるということです。したがって、1つの追加コマンドを実行する必要があります。
_change_column :global_feeds, :guid, :string, :limit => 25
_
基本的に2つのSQLコマンドを実行して、1つで可能であると私が信じていることを取得する必要があるのは少し複雑なようです。
これを最適化する方法について何か提案はありますか?
MySQLを使用していると思われるので、ここで試すことができます
create_table :global_feeds, {:id => false} do |t|
t.string :guid
t.text :title
t.text :subtitle
t.timestamps
end
execute "ALTER TABLE global_feeds ADD PRIMARY KEY (guid);"
MySQLを使用していない場合は、execute
コマンドのクエリを変更してDBエンジンで機能するようにする必要があります。 SQLiteでそれができるかどうかはわかりませんが。そして、この行をglobal_feed.rbモデルのどこかに置くことを忘れないでください:
set_primary_key :guid
とにかく、その規則を守りながらRailsを最大限に活用しています。主キーの名前とタイプを変更することは、あまり良い考えではないかもしれません。
Rails 4でできる;
create_table :global_feeds, id: false do |t|
t.string :guid, primary_key: true
...
end
#stringの代わりに#columnを使用する必要があります。例えば:
create_table(:global_feeds, :primary_key => 'guid') do |t|
t.column :guid, "varchar(25)", :null => false
...
end
varchar
タイプは、MySQL以外のデータベースに移植できないことに注意してください。
Rails 5、問題が発生した人のためにArgumentError: Index name '*' on table '*' already exists
いつ Rails db:setup
@kakoniからの移行では、次のように動作します
create_table(:global_feeds, primary_key: :guid, id: false) do |t|
t.string :guid
...
end
詳細については、 create_table を確認してください。