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

3
예, 그렇게 할 수 있지만 나중에 위의 코드를 반영하기 위해 마이그레이션을 편집해야합니다.
Jaap Haagmans 2013

: table은 복수형이어야합니까?
무덤

1
@tomb 원래 질문의 예를 사용했습니다. :table실제 테이블 이름입니다, 그래서의 경우 users테이블, 당신은 대체 것 :users을 위해 :table.
Jaap Haagmans

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

2
@fwuensche에게 : 나중에 인덱스를 추가해도 성능이 저하되지 않습니다. 그러나 도메인 논리는 명확하지 않습니다. 경우 예 : 당신이 휴식 / 추상적 결정 / 등 나중에 연결, 당신은 정말 하나 하나 있었어야 두 개의 별도의 마이그레이션, ... 처리해야 할 것
바딤 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

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

이것을 사용할 수 있습니다. 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.