Railsアプリでテーブルtable
を作成したとします。しばらくして、実行中の列を追加します。
Rails generate migration AddUser_idColumnToTable user_id:string.
次に、user_id
をインデックスとして追加する必要があることに気付きました。 add_index
メソッドについて知っていますが、このメソッドをどこで呼び出す必要がありますか?移行を実行する必要がありますか(はい、どれですか?)、この方法を手動で追加しますか?
インデックスに対してのみ、別の移行を実行できます。
class AddIndexToTable < ActiveRecord::Migration
def change
add_index :table, :user_id
end
end
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
テーブルに追加されます。
既存の列にインデックスを追加するだけの場合、例えばname
テーブルのuser
では、次の手法が役立ちます。
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
次の列を作成した後、生成された移行に追加します(例)
add_index :photographers, :email, :unique => true
あなたが呼び出すことができる参照のために
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 :dt_json_structs, :ordination_number, unique: true
end
end
これを使用できます。Jobはインデックスを追加するモデルの名前だと考えてください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