web-dev-qa-db-ja.com

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

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

Rails generate migration AddUser_idColumnToTable user_id:string. 

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

109
user1611830

インデックスに対してのみ、別の移行を実行できます。

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

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
63
Vadym Tyemirov

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

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

あなたが呼び出すことができる参照のために

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
4
Mauro

これを使用できます。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
1
vidur punj