Rails 마이그레이션 : self.up 및 self.down 대 변경


86

새로운 rails 버전에는 self.up 및 self.down 메서드에 비해 "change"가있는 것 같습니다.

따라서 마이그레이션을 롤백해야 할 때 수행 할 작업을 어떻게 알 수 있습니까? 온라인 자습서를 기반으로 구현해야하는 다음 방법이 있습니다.

class AddImageToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :image_file_name, :string
    add_column :users, :image_content_type, :string
    add_column :users, :image_file_size, :integer
    add_column :users, :image_updated_at, :datetime
  end

  def self.down
    remove_column :users, :image_file_name, :string
    remove_column :users, :image_content_type, :string
    remove_column :users, :image_file_size, :integer
    remove_column :users, :image_updated_at, :datetime
  end    
end

새로운 변경 방법을 사용하여 어떻게 똑같이 할 수 있습니까?


답변:


110

많은 작업에서 레일은 역 연산이 무엇인지 추측 할 수 있습니다 (문제없이). 예를 들어, 귀하의 경우 add_column롤백 할 때 호출 하는 역방향 작업은 무엇입니까? 물론 remove_column입니다. 의 역은 create_table무엇입니까? 그것은이다 drop_table. 따라서 이러한 경우 레일은 롤백하는 방법을 알고 down메소드를 정의하는 것은 불필요합니다 (문서 에서 변경 메소드에서 현재 지원되는 메소드를 볼 수 있음 ).

그러나 어떤 종류의 작업에 대해 여전히 down메서드 를 정의해야하기 때문에주의 해야합니다. 예를 들어 10 진수 열의 정밀도를 변경하는 경우 롤백시 원래 정밀도를 추측하는 방법은 무엇입니까? 불가능하므로 down방법 을 정의해야합니다 .

말했듯이 Rails Migrations Guide 를 읽어 보시기 바랍니다 .


33

Up, Down, Change를 사용하는 것이 더 좋습니다.

On Rails 3 (Reversible) : 위쪽에는 새 열을 추가하고 위쪽에는 테이블의 모든 레코드를 채우고 아래쪽에는이 열만 삭제해야합니다.

def up
  add_column :users, :location, :string
  User.update_all(location: 'Minsk')
end

def down
  remove_column :users, :location
end

그러나:

시간을 절약 할 수있는 변경 방법을 사용하지 않아야했습니다. 예를 들어, 추가 한 직후에 열 값을 업데이트 할 필요가 없다면 다음과 같이 코드를 줄일 수 있습니다.

def change
  add_column :users, :location, :string
end

위쪽에는 테이블에 열을 추가하고 아래쪽에는 제거합니다. 훨씬 적은 코드와 이익입니다.

On Rails 4 : 필요한 것을 한곳에 작성하는 또 하나의 유용한 방법 :

def change
  add_column :users, :location, :string
  reversible do |direction|
    direction.up { User.update_all(location: 'Minsk') }
  end
end

좋은 설명 형제
Bibek 샤르마

되 돌리시겠습니까? 변화의 방향을 알려주는 좋은 방법이기도합니다.
baash05

이 중 어느 것도 작동하지 않습니다. 나는 계속 ActiveRecord::IrreversibleMigration.
계정

레일이 마이그레이션을 롤백하지 못하는 상황이 있습니다. 그들의 참조하시기 바랍니다 도움
Kaleem Ullah

1
class AddImageToUsers < ActiveRecord::Migration
  def change
    add_column :users, :image_file_name, :string
    add_column :users, :image_content_type, :string
    add_column :users, :image_file_size, :integer
    add_column :users, :image_updated_at, :datetime
  end
end

감사합니다.하지만 롤백하면 어떻게 될까요? 무엇을해야할지 알고 있습니까?
banditKing

3
나는 늦잠을 잤다. Aldo 'xoen'Giambelluca는 모든 것을 설명합니다.
아무것도 - 특수 여기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.