단일 마이그레이션을 실행하는 쉬운 방법이 있습니까? 특정 버전으로 마이그레이션하고 싶지 않고 특정 버전을 실행하고 싶습니다.
답변
루비 파일에서 직접 코드를 실행할 수 있습니다.
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
참고 : 최신 버전의 레일 AddFoos.new.up
대신이 필요할 수 있습니다 AddFoos.up
.
IRB가없는 다른 방법은 클래스 이름 배열을 반환해야한다는 사실에 의존합니다.
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
이 작업을 수행하면 schema_migrations
테이블이 업데이트되지 않지만 어쨌든 원하는 것처럼 보입니다.
답변
최신 버전의 Rails를 가정하면 언제든지 다음을 실행할 수 있습니다.
rake db:migrate:up VERSION=20090408054532
여기서 version은 마이그레이션 파일 이름의 타임 스탬프입니다.
편집 : 지난 8 년 동안 어느 시점에서 (어떤 버전인지 확실하지 않습니다) Rails는 이미 실행 된 경우이를 실행하지 못하게하는 검사를 추가했습니다. 이것은 schema_migrations
테이블 의 항목으로 표시됩니다 . 다시 실행하려면 간단히 실행하십시오 rake db:migrate:redo VERSION=20090408054532
.
답변
특정 마이그레이션 을 실행 하려면 다음을 수행하십시오.
$ rake db:migrate:up VERSION=20080906120000
마이그레이션을 여러 번 실행하려면 다음을 수행하십시오.
# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3
단일 마이그레이션을 여러 번 실행하려면 다음을 수행하십시오.
# this is super useful
$ rake db:migrate:redo VERSION=20080906120000
(이주 파일 이름에서 버전 번호를 찾을 수 있습니다)
편집 : 마이그레이션 파일의 이름을 간단히 바꿀 수도 있습니다 (예 :
20151013131830_my_migration.rb
-> 20151013131831_my_migration.rb
그런 다음 정상적으로 마이그레이션하면 마이그레이션이 새로운 마이그레이션으로 처리됩니다 (스테이징과 같은 원격 환경에서 마이그레이션하려는 경우 유용).
편집 2 : 데이터베이스에서 마이그레이션 항목을 정리할 수도 있습니다. 예 :
rails_c> q = "delete from schema_migrations where version = '20151013131830'"
rails_c> ActiveRecord::Base.connection.execute(q)
rake db:migrate
그런 다음 up
nuked 마이그레이션 방법 을 다시 실행합니다 .
답변
다음 change
과 같은 방법을 구현 한 경우 :
class AddPartNumberToProducts < ActiveRecord::Migration
def change
add_column :products, :part_number, :string
end
end
다음과 같이 마이그레이션 인스턴스를 작성하고 인스턴스에서 migrate(:up)
또는 migrate(:down)
인스턴스에서 실행할 수 있습니다 .
$ rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)
답변
이 마이그레이션 파일 “20150927161307_create_users.rb”를 다시 실행하는 단계입니다.
- 콘솔 모드를 실행하십시오. (레일 c)
-
해당 파일에있는 클래스를 복사하여 콘솔에 붙여 넣습니다.
class CreateUsers < ActiveRecord::Migration def change create_table :users do |t| t.string :name t.string :email t.timestamps null: false end end end end
-
클래스의 인스턴스를 만듭니다
CreateUsers
.c1 = CreateUsers.new
change
해당 인스턴스 의 메소드 를 실행하십시오 .c1.change
답변
현재 rails 5
당신은 또한 사용할 수 있습니다 rails
대신rake
레일 3-4
# < rails-5.0
rake db:migrate:up VERSION=20160920130051
레일 5
# >= rails-5.0
rake db:migrate:up VERSION=20160920130051
# or
rails db:migrate:up VERSION=20160920130051
답변
경로에 문제가있는 경우 사용할 수 있습니다
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
