새로운 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
새로운 변경 방법을 사용하여 어떻게 똑같이 할 수 있습니까?
답변
많은 작업에서 레일은 역 연산이 무엇인지 추측 할 수 있습니다 (문제없이). 예를 들어, 귀하의 경우 add_column
롤백 할 때 호출 하는 역방향 작업은 무엇입니까? 물론 remove_column
입니다. 의 역은 create_table
무엇입니까? 그것은이다 drop_table
. 따라서 이러한 경우 레일은 롤백하는 방법을 알고 down
메소드를 정의하는 것은 불필요합니다 (문서 에서 변경 메소드에서 현재 지원되는 메소드를 볼 수 있음 ).
그러나 어떤 종류의 작업에 대해 여전히 down
메서드 를 정의해야하기 때문에주의 해야합니다. 예를 들어 10 진수 열의 정밀도를 변경하는 경우 롤백시 원래 정밀도를 추측하는 방법은 무엇입니까? 불가능하므로 down
방법 을 정의해야합니다 .
말했듯이 Rails Migrations Guide 를 읽어 보시기 바랍니다 .
답변
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
답변
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