[ruby-on-rails] Rails : 열 추가 후 인덱스 추가

tableRails 앱에서 테이블 을 만들었다 고 가정 해 보겠습니다. 얼마 후 실행중인 열을 추가합니다.

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테이블.

경우 당신은 기존 열 예에 인덱스를 추가 할 필요가 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


답변

다음 열을 생성 한 후 생성 된 마이그레이션에 추가합니다 (예제).

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 :tables, :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


답변