是否有一种简单的方法来运行单个迁移?我不想迁移到某个版本,我只想运行一个特定的版本。
当前回答
你可以直接从ruby文件中运行代码:
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.new.up
注意:非常老版本的rails可能需要addfoo。up而不是addfoo .new.up。
另一种方法(没有IRB)依赖于require返回类名数组的事实:
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
注意,如果这样做,就不会更新schema_migrations表,但这似乎正是您想要的结果。
此外,如果无法找到文件,您可能需要使用require("./db/…"或根据您的工作目录尝试require_relative
其他回答
你可以直接从ruby文件中运行代码:
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.new.up
注意:非常老版本的rails可能需要addfoo。up而不是addfoo .new.up。
另一种方法(没有IRB)依赖于require返回类名数组的事实:
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
注意,如果这样做,就不会更新schema_migrations表,但这似乎正是您想要的结果。
此外,如果无法找到文件,您可能需要使用require("./db/…"或根据您的工作目录尝试require_relative
如果你已经实现了这样一个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)
假设你可以运行最新版本的Rails:
rake db:migrate:up VERSION=20090408054532
其中version是迁移文件名中的时间戳。
编辑:在过去8年的某个时候(我不确定是哪个版本),Rails添加了检查,如果它已经运行,则阻止它运行。schema_migrations表中的一个条目表明了这一点。要重新运行它,只需执行rake db:migrate:redo VERSION=20090408054532即可。
看起来至少在最新的Rails发行版(撰写本文时为5.2)中还有一种过滤正在运行的迁移的方法。可以在SCOPE环境变量中传递一个过滤器,然后使用该过滤器选择迁移文件。
假设您有两个迁移文件1_add_foos。Rb和2_add_fos .run_this_one. Rb运行
SCOPE=run_this_one rails db:migrate:up
将只选择并运行2_add_fos .run_this_one.rb。请记住,将运行与范围匹配的所有迁移文件。
请注意,您可能不得不在新的rails环境中使用rails runner而不是script/runner。
推荐文章
- 如何在Ruby On Rails中使用NuoDB手动执行SQL命令
- 是否可以在MiniTest中运行单个测试?
- 如何在Ruby中生成a和b之间的随机数?
- ActiveRecord OR查询
- 无法安装gem -未能建立gem本地扩展-无法加载这样的文件——mkmf (LoadError)
- 如何在Ruby中创建文件
- 什么是Ruby文件。开放模式和选项?
- Ruby数组到字符串的转换
- 如何分割(块)一个Ruby数组成X元素的部分?
- Ruby中“or”和||的区别?
- 在Rails中使用user_id:integer vs user:references生成模型
- 如何测试参数是否存在在轨道
- 验证多个列的唯一性
- Rails:在where语句中使用大于/小于
- Rails:如何为Rails activerecord的模型中的属性创建默认值?