2011-12-12 4 views
3

마이그레이션 중 하나를 롤백하는 중에 문제가 발생했습니다. Rails가 임시 인덱스를 사용하여 마이그레이션을위한 임시 테이블을 생성하는 것처럼 보입니다. 이 테이블의 실제 인덱스는 64 자 미만이지만 Rails가 임시 인덱스를 만들려고 할 때마다 64 자 이상의 이름으로 바뀌고 오류가 발생합니다. 내가 열 이름을 변경 한레일스 이전에서 임시 인덱스 이름이 너무 깁니다.

== AddColumnNameToPrices: reverting ============================================ 
-- remove_column(:prices, :column_name) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

Index name 'temp_index_altered_prices_on_column_and_other_column_and_third_column' on table  'altered_prices' is too long; the limit is 64 characters 

하지만 예는 아직 거기 :

class AddColumnNameToPrices < ActiveRecord::Migration 
    def self.up 
    add_column :prices, :column_name, :decimal 
    end 

    def self.down 
    remove_column :prices, :column_name 
    end 
end 

여기에 내가지고있어 오류가있다 :

여기 내 간단한 마이그레이션합니다. 두 번째 마이그레이션에서 변경 작업을 수행 할 수는 있지만 여전히이 테이블에서 마이그레이션을 롤백 할 수 없음을 의미합니다. 새 마이그레이션에서 인덱스의 이름을 바꿀 수는 있지만 여전히이 단일 마이그레이션에서 나를 잠급니다.

누구든지이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

+0

인덱스의 실제 이름이 포함 된 것을입니까? – cristian

+0

아니요 아니요. 실제 프로젝트에서 조금 추상화하려고했습니다. – caitlin

답변

7

데이터베이스 스키마에 실제로 prices_on_column_and_other_column_and_third_column이라는 색인이있는 것 같습니다. 이전 게임에서 마이그레이션으로 인덱스를 정의했을 수도 있습니다. 그러나 마이그레이션에서 인덱스 정의를 삭제하는 것보다. (당신이 코드는 생산이 아닌 경우 작동)

  • 더 간단 하나가 : 그것이 사실 인 경우

    당신은 두 가지 옵션이 있습니다. rake db : drop db : create db : migrate를 호출하여 db/schema.rb가 아닌 마이그레이션을 사용하여 처음부터 데이터베이스를 다시 작성할 수 있습니다. 다른 이주 파일에서이 이름을 가진이 색인을 작성하지 않도록하십시오. 그렇다면 add_index 호출에 :name => 'short_index_name' 옵션을 추가하여 레일스가 인덱스의 짧은 이름을 생성하도록합니다.

  • 프로덕션 데이터베이스에서이 문제가 발생하면 조금 더 복잡해집니다. 데이터베이스 콘솔에서 색인을 수동으로 h 제해야 할 수도 있습니다.
+0

rake db : migrate : reset 또한 유용합니다. –

+0

유용하지만 아직 모든 레코드를 삭제합니다 (당연히). – Ted

3

오늘이 문제가 발생하여 긴 이름 문제를 일으키는 색인을 삭제하고 추가하기 위해 이전을 변경하여 문제를 해결했습니다.

나는 다음과 같은 추가 (정말 긴 이름은 원인이되는이된다) 나는 열 유형을 변경하고있는 동안 변경이 추적되지 않습니다이 방법은 :

class FixBadColumnTypeInNotifications < ActiveRecord::Migration 
    def change 
    # replace string ID with integer so it is Postgres friendly 
    remove_index :notifications, ["notifiable_id","notifiable_type"] 
    change_column :notifications, :notifiable_id, :integer 
    # shortened index name 
    add_index "notifications", ["notifiable_id","notifiable_type"], :name => "notifs_on_poly_id_and_type" 
    end 
end 
관련 문제