回答:
rubyファイルから直接コードを実行できます。
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
注:新しいバージョンのレールでは、AddFoos.new.up
ではなくが必要になる場合がありAddFoos.up
ます。
requireがクラス名の配列を返すという事実に依存する別の方法(IRBなし):
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
これを行うと、おそらくschema_migrations
テーブルは更新されませんが、とにかくそれが望ましいようです。
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
その後AddFoos.new.up
change
でup
andの代わりにを使用するdown
場合は、実行する必要がありますAddFoos.new.migrate(:up)
AddFoos.new.change
Railsのかなり最近のバージョンを想定すると、いつでも実行できます:
rake db:migrate:up VERSION=20090408054532
ここで、versionは移行のファイル名のタイムスタンプです。
編集:過去8年間のある時点で(どのバージョンかわからない)すでに実行されている場合、Railsはこれを実行しないようにするチェックを追加しました。これは、schema_migrations
表のエントリで示されています。再実行するには、rake db:migrate:redo VERSION=20090408054532
代わりに単に実行します。
rake db:migrate:down VERSION=XXX
$ 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:データベースの移行エントリをnukeすることもできます。例えば:
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)
up
およびを使用している場合にも適用されますdown
。
これは、この移行ファイル「20150927161307_create_users.rb」を再度実行する手順です。
そのファイルにあるクラスをコピーしてコンソールに貼り付けます。
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
require "./db/migrate/20150927161307_create_users.rb"
。コピーと貼り付けの代わりに。その後、クラスで定義されたメソッドをインスタンス化して呼び出すことで、同じ方法でクラスを実行できますCreateUsers.new.change
。
現在の代わりにrails 5
使用することもできますrails
rake
Rails 3-4
# < rails-5.0
rake db:migrate:up VERSION=20160920130051
Rails 5
# >= rails-5.0
rake db:migrate:up VERSION=20160920130051
# or
rails db:migrate:up VERSION=20160920130051
rails db:migrate VERSION=20160920130051
パスに問題がある場合は、
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
の代わりにscript/runner
、rails runner
新しいRails環境で使用する必要がある場合があることに注意してください。
コンソールから実行したい場合、これはあなたが探しているものです:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
私は他の答えを試しましたが、Rails.root
私にとっては効果がありませんでした。
また、.migrate(:up)
partは、移行が既に実行されているかどうかに関係なく、移行を強制的に再実行します。これは、すでに移行を実行していて、dbをいじって元に戻し、迅速な解決策を取り戻したい場合に便利です。