migration으로 rollback 가능 여부로 change 또는 up/down를 구분

7015 단어 migration루비Rails
migration에서 change로 써도 rollback 할 수있는 것, up/down으로 쓰지 않으면 rollback 할 수없는 것을 정리했습니다.
첫 투고입니다. 잘 부탁드립니다.

롤백 가능 (change로 OK)



열 추가



rails g migration AddColumnUsers
class AddColumnUser < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :age, :integer
  end
end

열 이름 바꾸기


class RenameColumnFilmsReviewsFromNameToTitle < ActiveRecord::Migration[6.0]
  def change
    rename_column :films_reviews, :name, :title
  end
end

열에 색인 추가



class AddIndexToUserOfName < ActiveRecord::Migration[6.0]
  def change
    add_index :users, :name_badge: 
  end
end

열에 기본값 설정(change_column_default 사용)



class ChangeColumnDefaultUserOfSocial < ActiveRecord::Migration[6.0]
  def change
    change_column_default :users, :social, from: nil, to: false
  end
end 

rollback 할 수 없다 (up / down으로 쓴다)



change로 작성하면 다음 오류가 발생합니다.
Caused by:
ActiveRecord::IrreversibleMigration: 

This migration uses change_column, which is not automatically reversible.
To make the migration reversible you can either:
1. Define #up and #down methods in place of the #change method.
2. Use the #reversible method to define reversible behavior.

열의 데이터 형식 변경



rails g migration ChangeColumnUsersToGender

class ChangeDataUserToGender < ActiveRecord::Migration[6.0]
  def up
    change_column :users, :gender, :boolean
  end

  def down
    change_column :users, :gender, :integer
  end
end

열에 null을 허용하지 않도록 변경



class ChangeColumnUserForName < ActiveRecord::Migration[6.0]
  def up
    change_column :users, :name, :string, null: false
  end

  def down
    change_column :users, :name, :string, null: true
  end
end 

열에 기본값 설정 (change_column_default를 사용하지 않는 경우)



# change_column_defaultを使うとchangeでもrollbackできる
class AddDefaultValueUserOfOccupation < ActiveRecord::Migration[6.0]
  def up
    change_column :users, :occupation, :integer, default: 1
  end

  def down
    # default値を指定していなかった場合 default:nilと書かないとrollback時にnilに戻らない
    change_column :users, :occupation, :integer, default: nil
  end
end

RailsGuide에 따르면 복잡한 일을 할 때는 reversible을 사용합시다는 것도 있지만, 그것은 또 다른 기회에. (또 이번이라고 하는 때는 우선 쓰지 않을지도 모릅니다만 )

마이그레이션을 역방향으로 실행(롤백)하는 방법을 추측할 수 없는 경우, reversible 를 사용합니다.

좋은 웹페이지 즐겨찾기