単一の移行を実行する簡単な方法はありますか?特定のバージョンに移行するのではなく、特定のバージョンを実行するだけです。
Rubyファイルから直接コードを実行できます。
Rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
注:Railsの新しいバージョンでは、AddFoos.new.up
ではなくAddFoos.up
が必要になる場合があります。
Requireがクラス名の配列を返すという事実に依存する代替方法(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
singlemigrationmultiple回実行したい場合は、
# this is super useful
$ rake db:migrate:redo VERSION=20080906120000
(バージョン番号は移行のファイル名で確認できます)
編集:また、移行ファイルの名前を変更することもできます。例:
20151013131830_my_migration.rb
-> 20151013131831_my_migration.rb
その後、通常どおり移行します。これにより、移行が新しいものとして扱われます(制御が少ないリモート環境(ステージングなど)に移行する場合に便利です)。
Edit 2:データベースの移行エントリを削除することもできます。例えば:
Rails_c> q = "delete from schema_migrations where version = '20151013131830'"
Rails_c> ActiveRecord::Base.connection.execute(q)
その後、rake db:migrate
は、nuked移行のup
メソッドを再実行します。
次のような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」を再度実行する手順です
そのファイルにあるクラスをコンソールにコピーして貼り付けます。
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 Rails.root + 'db/migrate/20090408054532_add_foos.rb'
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
script/runner
の代わりに、新しいRails環境でRails runner
を使用する必要がある場合があることに注意してください。
方法1:
rake db:migrate:up VERSION=20080906120000
方法2:
Rails Consoleで1.移行クラスをコンソールにコピーして貼り付けます(たとえば、add_name_to_user.rb)2.次に、コンソールで次のように入力します。
Sharding.run_on_all_shards{AddNameToUser.up}
されております!!
少なくとも最新のRailsリリース(執筆時点では5.2)では、実行中の移行をフィルタリングする方法がもう1つあるようです。 SCOPE
環境変数でフィルターを渡すことができます。この変数は、移行ファイルの選択に使用されます。
2つの移行ファイル1_add_foos.rb
および2_add_foos.run_this_one.rb
が実行されていると仮定します
SCOPE=run_this_one Rails db:migrate:up
2_add_foos.run_this_one.rb
のみを選択して実行します。スコープに一致するすべての移行ファイルが実行されることに注意してください。