ActiveRecord 모델과 그 표를 레일로 바꾸기 위해 마이그레이션을 어떻게 작성합니까?

StackOverflow https://stackoverflow.com/questions/471416

문제

나는 이름 지정에 끔찍하고 레일 앱에 내 모델에 대한 더 나은 이름 세트가 있다는 것을 알고 있습니다.
마이그레이션을 사용하여 모델 이름과 해당 테이블의 이름을 바꾸는 방법이 있습니까?

도움이 되었습니까?

해결책

예는 다음과 같습니다.

class RenameOldTableToNewTable < ActiveRecord::Migration
  def self.up
    rename_table :old_table_name, :new_table_name
  end

  def self.down
    rename_table :new_table_name, :old_table_name
  end
end

모델 선언 파일의 이름을 수동으로 바꿔야했습니다.

편집하다:

레일 3.1 & 4에서 ActiveRecord::Migration::CommandRecorder rename_table 마이그레이션을 뒤집는 방법을 알고 있으므로 다음을 수행 할 수 있습니다.

class RenameOldTableToNewTable < ActiveRecord::Migration
  def change
    rename_table :old_table_name, :new_table_name
  end 
end

(여전히 파일 이름을 수동으로 변경해야합니다.)

다른 팁

Rails 4에서 내가해야 할 일은 Def Change였습니다.

def change
  rename_table :old_table_name, :new_table_name
end

그리고 나의 모든 지수는 나를 위해 처리되었습니다. 오래된 색인을 제거하고 새 인덱스를 추가하여 수동으로 업데이트 할 필요가 없었습니다.

그리고 그것은 인덱스와 관련하여 위 또는 아래로 올라가기 위해 변경을 사용하여 작동합니다.

다른 답변과 의견은 테이블 이름 바꾸기, 파일 이름 바꾸기 및 코드를 통과했습니다.

몇 가지 경고를 추가하고 싶습니다.

오늘 직면 한 실제 예제를 사용해 봅시다 : '판매자'에서 '비즈니스'로 모델을 바꾸십시오.

  • 동일한 마이그레이션에서 종속 테이블과 모델의 이름을 변경하는 것을 잊지 마십시오. 상인과 상인 스타트 모델을 동시에 비즈니스 및 비즈니스 스타트로 변경했습니다. 그렇지 않으면 검색 및 재구성을 수행 할 때 너무 많은 선택과 선택을해야했습니다.
  • 외국 키를 통한 모델에 의존하는 다른 모델의 경우 다른 테이블의 외국 키 열 이름은 원래 모델 이름에서 파생됩니다. 따라서 이러한 종속 모델에서 Rename_Column 호출을 수행하고 싶을 것입니다. 예를 들어, 다양한 조인 테이블 (HAS_AND_BELONGS_TO_MANY 관계의 경우) 및 기타 종속 테이블 (일반 HAS_ONE 및 HAS_MANY 관계)에서 'MERCHANT_ID'열을 'Business_ID'로 이름을 바꿔야했습니다. 그렇지 않으면 'business.id'를 가리키는 'business_stat.merchant_id'와 같은 열로 끝났을 것입니다. 다음은 열 이름 이름을 작성하는 것에 대한 좋은 답변입니다.
  • 그레핑 할 때, 단수, 복수, 대문자, 소문자 및 문도 (주석으로 발생할 수있는) 버전을 검색하는 것을 잊지 마십시오.
  • 먼저 복수 버전을 검색 한 다음 단수를 검색하는 것이 가장 좋습니다. 이렇게하면 내 상인 :: 비즈니스 예와 같이 불규칙한 복수형이 있다면 모든 불규칙한 복수를 올바르게 얻을 수 있습니다. 그렇지 않으면 예를 들어 '비즈니스'(3 초)를 중간 상태로 끝날 수 있습니다.
  • 모든 사건을 맹목적으로 대체하지 마십시오. 모델 이름이 일반적인 프로그래밍 용어, 다른 모델의 값 또는 뷰에서 텍스트 콘텐츠와 충돌하면 너무 과도하게 될 수 있습니다. 내 예에서는 모델 이름을 '비즈니스'로 변경하고 싶었지만 여전히 UI의 내용에서 '판매자'라고합니다. 또한 Cancan에서 사용자에게 '판매자'역할을했습니다. 상인 역할과 판매자 모델 사이의 혼란이 있었는데, 이는 처음에 모델의 이름을 바꾸게했습니다.

또한 색인을 교체해야합니다.

class RenameOldTableToNewTable< ActiveRecord:Migration
  def self.up
    remove_index :old_table_name, :column_name
    rename_table :old_table_name, :new_table_name
    add_index :new_table_name, :column_name
  end 

  def self.down
    remove_index :new_table_name, :column_name
    rename_table :new_table_name, :old_table_name
    add_index :old_table_name, :column_name
  end
end

여기에서 설명하는 다른 답변과 같이 수동으로 파일의 이름을 바꿉니다.

보다: http://api.rubyonrails.org/classes/activerecord/migration.html

이 마이그레이션을 작성한 후 롤백 및 롤 전진 할 수 있는지 확인하십시오. 당신이 뭔가 잘못되었고 더 이상 존재하지 않는 무언가에 영향을 미치려고 시도하는 마이그레이션에 갇히면 까다로워 질 수 있습니다. 전체 데이터베이스를 최대한 활용하고 롤백 할 수없는 경우 다시 시작하십시오. 그러니 무언가를 뒷받침해야 할 수도 있습니다.

또한 : HAS_ 또는 FORGS_TO 또는 무언가로 정의 된 다른 테이블의 관련 열 이름에 대해 Schema_DB를 확인하십시오. 아마 그것들도 편집해야 할 것입니다.

그리고 마지막으로 회귀 테스트 스위트 없이이 작업을 수행하는 것은 견해가 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top