[ruby-on-rails] Rails 마이그레이션 : 존재 여부를 확인하고 계속 진행 하시겠습니까?

마이그레이션에서 이런 종류의 작업을 수행했습니다.

add_column :statuses, :hold_reason, :string rescue puts "column already added"

그러나 이것이 SQLite에서는 작동하지만 PostgreSQL에서는 작동하지 않는 것으로 나타났습니다 . add_column이 터지면 Exception이 잡혀도 트랜잭션이 종료되어 마이그레이션이 추가 작업을 수행 할 수없는 것 같습니다.

컬럼이나 테이블이 이미 존재하는지 확인 하는 비 DB 분리 방법이 있습니까? 실패하면 구조 블록이 실제로 작동하도록 할 수있는 방법이 있습니까?



답변

Rails 3.0 이상에서는을 사용 column_exists?하여 열의 존재 여부를 확인할 수 있습니다 .

unless column_exists? :statuses, :hold_reason
  add_column :statuses, :hold_reason, :string
end

table_exists?Rails 2.1까지 거슬러 올라가는 함수 도 있습니다 .


답변

또는 더 짧게

add_column :statuses, :hold_reason, :string unless column_exists? :statuses, :hold_reason


답변

들어 레일 2.X , 당신은 다음과 컬럼의 존재를 확인할 수 있습니다 :

columns("[table-name]").index {|col| col.name == "[column-name]"}

nil을 반환하면 해당 열이 존재하지 않습니다. Fixnum을 리턴하면 열이 존재하는 것입니다. 당연히 {...}이름보다 더 많은 이름으로 열을 식별하려는 경우 사이에 더 많은 선택적 매개 변수를 넣을 수 있습니다 . 예를 들면 다음과 같습니다.

{ |col| col.name == "foo" and col.sql_type == "tinyint(1)" and col.primary == nil }

(이 답변 은 레일에서 조건부 마이그레이션을 작성하는 방법에 처음 게시 되었습니까? )


답변

add_column :statuses, :hold_reason, :string unless Status.column_names.include?("hold_reason")


답변