Rails:列を追加した後にインデックスを追加する


119

tableRailsアプリでテーブルを作成したとします。しばらくして、実行する列を追加します。

rails generate migration AddUser_idColumnToTable user_id:string. 

次にuser_id、インデックスとして追加する必要があることに気付きました。add_indexメソッドについては知っていますが、このメソッドはどこで呼び出す必要がありますか?私はマイグレーションを実行することになっていますか(はいの場合、どれですか?)、次にこのメソッドを手動で追加しますか?

回答:


235

インデックスのためだけに、別の移行を実行できます。

class AddIndexToTable < ActiveRecord::Migration
  def change
    add_index :table, :user_id
  end
end

4
だから私は単に私のコンソールで実行します:railsは移行AddIndexToTableを生成しますか?
user1611830 2013

3
はい、できますが、上記のコードを反映するために、後でその移行を編集する必要があります。
Jaap Haagmans 2013

:tableは複数であるはずですか?

1
@tomb元の質問の例を使用しました。:tableは実際のテーブル名なので、usersテーブルの場合はの代わりに使用:users:tableます。
Jaap Haagmans、2018

65

を作成する必要がuser_idある場合は、ユーザーテーブルを参照していることを前提としています。この場合、移行は次のようになります。

rails generate migration AddUserRefToProducts user:references

このコマンドは、次の移行を生成します。

class AddUserRefToProducts < ActiveRecord::Migration
  def change
    add_reference :user, :product, index: true
  end
end

列とインデックスのrake db:migrate両方を実行user_idすると、productsテーブルに追加されます。

あなただけ例えば、既存の列にインデックスを追加する必要がある場合nameuser表は、以下の技術が役立つことがあります。

rails generate migration AddIndexToUsers name:string:index 次の移行が生成されます:

class AddIndexToUsers < ActiveRecord::Migration
  def change
    add_column :users, :name, :string
    add_index :users, :name
  end
end

add_column行を削除して移行を実行します。

説明されているケースでは、rails generate migration AddIndexIdToTable index_id:integer:indexコマンドを発行してadd_columnから、生成されたマイグレーションから行を削除することができます。ただし、最初の移行を元に戻し、代わりに参照を追加することをお勧めします。

rails generate migration RemoveUserIdFromProducts user_id:integer
rails generate migration AddUserRefToProducts user:references

完全な回答を提供してくれたVadymに感謝します。最後の質問です。最初の移行を元に戻すことが推奨されるのはなぜですか。後でインデックスを追加することに関連するパフォーマンスの問題はありますか?
Flavio Wuensche、2015年

2
@fwuenscheへ:後でインデックスを追加してもパフォーマンスが低下することはありません。ただし、ドメインロジックはあまり明確ではありません。たとえば、関連付けを後で解除/抽象化/その他する場合は、2つの個別の移行を処理する必要があります。これらは実際には1つの移行であるはずです...
Vadym Tyemirov

6
警告:index:trueはcreate_table移行でのみ機能することに注意してください。移行は実行されますが、インデックスは作成されません。makandracards.com/makandra/…を
rmcsharry

9

次の列を作成した後に、生成された移行を追加します(例)

add_index :photographers, :email, :unique => true

あなたはこのようなものを意味します:def self.up add_column ... end add_index ...?
user1611830 2013

5

参照については、呼び出すことができます

rails generate migration AddUserIdColumnToTable user:references

将来的に一般的なインデックスを追加する必要がある場合は、これを起動できます

rails g migration AddOrdinationNumberToTable ordination_number:integer:index

コードを生成する:

class AddOrdinationNumberToTable < ActiveRecord::Migration
  def change
   add_column :tables, :ordination_number, :integer
   add_index :tables, :ordination_number, unique: true
  end
end

0

これを使用できます。ジョブは、インデックスcader_idを追加するモデルの名前であると考えてください。

class AddCaderIdToJob < ActiveRecord::Migration[5.2]
  def change
    change_table :jobs do |t|
      t.integer :cader_id
      t.index :cader_id
    end
  end
end
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.