web-dev-qa-db-ja.com

Rails Migration Create Table Primary Key

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つで可能であると私が信じていることを取得する必要があるのは少し複雑なようです。

これを最適化する方法について何か提案はありますか?

15
Ryan

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を最大限に活用しています。主キーの名前とタイプを変更することは、あまり良い考えではないかもしれません。

20
Max Al Farakh

Rails 4でできる;

create_table :global_feeds, id: false do |t|
  t.string :guid, primary_key: true
 ...
end
25
kakoni

#stringの代わりに#columnを使用する必要があります。例えば:

create_table(:global_feeds, :primary_key => 'guid') do |t|
  t.column :guid, "varchar(25)", :null => false
  ...
end

varcharタイプは、MySQL以外のデータベースに移植できないことに注意してください。

4

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 を確認してください。

1
hxpax