나는 이름을 짓는데 끔찍하며 내 Rails 앱에 더 나은 모델 이름이 있다는 것을 알고 있습니다.
마이그레이션을 사용하여 모델 및 해당 테이블의 이름을 바꾸는 방법이 있습니까?
답변
예를 들면 다음과 같습니다.
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
모델 선언 파일을 수동으로 바꿔야했습니다.
편집하다:
Rails 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
rename_table :old_table_name, :new_table_name
end
그리고 모든 색인이 나를 위해 돌 보았습니다. 이전 인덱스를 제거하고 새 인덱스를 추가하여 인덱스를 수동으로 업데이트 할 필요가 없었습니다.
그리고 인덱스와 관련하여 위 또는 아래로 변경을 사용하여 작동합니다.
답변
다른 답변과 의견에는 테이블 이름 바꾸기, 파일 이름 바꾸기 및 코드를 통한 grepping이 포함되었습니다.
몇 가지주의 사항을 추가하고 싶습니다.
오늘 직면 한 실제 예를 사용하여 모델을 ‘판매자’에서 ‘비즈니스’로 이름을 바꿉니다.
- 동일한 마이그레이션에서 종속 테이블 및 모델의 이름을 변경하는 것을 잊지 마십시오. Merchant 및 MerchantStat 모델을 동시에 Business 및 BusinessStat로 변경했습니다. 그렇지 않으면 검색 및 바꾸기를 수행 할 때 너무 많이 선택하고 선택해야했습니다.
- 외래 키를 통해 모델에 의존하는 다른 모델의 경우 다른 테이블의 외래 키 열 이름은 원래 모델 이름에서 파생됩니다. 따라서 이러한 종속 모델에 대해 rename_column 호출도 수행하려고합니다. 예를 들어, 다양한 조인 테이블 (has_and_belongs_to_many 관계) 및 기타 종속 테이블 (일반 has_one 및 has_many 관계)에서 ‘merchant_id’열의 이름을 ‘business_id’로 바꿔야했습니다. 그렇지 않으면 ‘business_stat.merchant_id’와 같은 열이 ‘business.id’를 가리키는 것으로 끝났을 것입니다.다음은 열 이름 변경에 대한 좋은 답변입니다.
- 그 리핑 할 때 문자열의 단수형, 복수형, 대문자, 소문자 및 대문자 (댓글로 표시 될 수 있음) 버전을 검색해야합니다.
- 먼저 복수 버전을 검색 한 다음 단수를 검색하는 것이 가장 좋습니다. 그렇게하면 내 판매자 :: 비즈니스 사례와 같이 불규칙 복수형이있는 경우 모든 불규칙 복수형을 올바르게 얻을 수 있습니다. 그렇지 않으면 예를 들어 ‘businesss'(3 s)가 중간 상태로되어 검색 및 교체가 더 많아 질 수 있습니다.
- 모든 사건을 맹목적으로 교체하지 마십시오. 모델 이름이 일반적인 프로그래밍 용어, 다른 모델의 값 또는 뷰의 텍스트 내용과 충돌하는 경우 너무 열렬해질 수 있습니다. 내 예에서는 모델 이름을 ‘Business’로 변경하고 싶지만 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_ 또는 belongs_to 등으로 정의 된 다른 테이블의 관련 열 이름에 대해서는 schema_db를 확인하십시오. 아마 그것들도 편집해야 할 것입니다.
마지막으로 회귀 테스트 스위트없이이를 수행하는 것은 쉽지 않습니다.
답변
레일 g 마이그레이션 rename_ {old_table_name} :이 명령을 실행 할 수 있습니다 에 {new_table_name}으로
파일을 편집하고 메소드 변경에이 코드를 추가 한 후
rename_table : {old_table_name}, : {new_table_name}