2013-04-08 12 views
65

Railsアプリケーションでテーブルtableを作成したとします。しばらくして、私は列の実行を追加します。Rails:列を追加した後のインデックスの追加

rails generate migration AddUser_idColumnToTable user_id:string. 

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

あなただけのインデックスのために、別の移行を実行することができます

答えて

147

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

私は単に私のコンソールで実行します:レールは移行AddIndexToTableを生成しますか? – user1611830

+1

これは可能ですが、上記のコードを反映させるために、後でその移行を編集する必要があります。 –

+0

はい、ありがとうございます! – user1611830

7

は、以下の(例)のカラムを作成した後に発生した移行に追加あなたはuser_idを作成する必要がある場合

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

あなたは次のような意味です:def self.up add_column ... end add_index ...? – user1611830

45

あなたがユーザーテーブルを参照しているという合理的な前提があります。

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

rake db:migrateカラムの両方を実行した後、インデックスはproductテーブルに追加される。

rails generate migration AddUserRefToProducts user:references 

このコマンドは、以下のマイグレーションを生成します。その場合、移行がなければなりません。

インデックスを既存の列に追加するだけで済みます。 userテーブルのname、以下の技術が有用であり得る:

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

add_columnラインを削除し、マイグレーションを実行する:

rails generate migration AddIndexToUsers name:string:index

は、以下のマイグレーションを生成します。

この場合、rails generate migration AddIndexIdToTable index_id:integer:indexコマンドを発行し、生成された移行からadd_column行を削除できます。あなたがこれを起動することができ、将来的にあなたが一般的なインデックスを追加する必要がある場合は、

rails generate migration AddUserIdColumnToTable user:references 

を呼び出すことができます

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

完全な答えをお寄せいただきありがとうございます。最後の質問の1つ:最初の移行を元に戻すことをおすすめします。後でインデックスを追加する際のパフォーマンス上の問題はありますか? –

+2

@fwuenscheに:後でインデックスを追加する場合のパフォーマンス上の不利益はありません。しかし、ドメインロジックはあまり明確ではありません。例えば。後でアソシエーションを中断/抽象化することを決めた場合は、2つの別々のマイグレーションを扱う必要があります。実際には単一のものであったはずです。 –

+2

注意:index:trueはcreate_tableの移行。移行は実行されますが、インデックスは作成されません。 https://makandracards.com/makandra/32353-psa-index-true-in-rails-migrations-does-not-work-as-you-d-expectをご覧ください。 – rmcsharry

1

を参照するために:しかし、私はむしろ、最初の移行を取り消し、代わりに参照を追加することをお勧めしたいです

rails g migration AddOrdinationNumberToTable ordination_number:integer:index 

生成するコード:

class AddOrdinationNumberToTable < ActiveRecord::Migration 
    def change 
    add_column :tables, :ordination_number, :integer 
    add_index :dt_json_structs, :ordination_number, unique: true 
    end 
end 
関連する問題