ruby-on-rails - 如何使用 Rails 迁移运行 rake 任务
问题描述
我想使用迁移运行 rake 任务,因为我们希望当用户运行时rails db:migrate
,该任务将通过迁移运行。
我的 rake 任务是:
namespace :task_for_log do
desc "This task set by default as current date for those logs where log_date is nil"
task set_by_default_date_of_log: :environment do
Log.where("log_date IS NULL").each do |log|
log.update_attributes(log_date: log.created_at.to_date)
end
end
end
请指导执行此任务的迁移是什么,这里有什么人可以挽救我的生命吗?
解决方案
迁移实际上只是遵循约定的 Ruby 文件,所以如果你想在其中运行 rake 任务,你可以调用 Rake 类。
class ExampleMigration < ActiveRecord::Migration[5.0]
def change
Rake::Task['task_for_log'].invoke
end
end
但是,迁移文件应该专门用于处理数据库模式。我会重新考虑您如何解决问题以获得更好的解决方案。例如,您可以运行更新日志属性的 SQL 语句,而不是调用 rake 任务。
class ExampleMigration < ActiveRecord::Migration[5.0]
def change
execute <<-SQL
UPDATE logs SET log_date = created_at WHERE log_date IS NULL
SQL
end
end
参考:
推荐阅读
- python - python子进程popen不执行php脚本
- c# - Json 输出的 C# 模型/实体类
- android - Android如何制作自定义可绘制形状
- flutter - 导航到另一个页面时,在 null 上调用了 getter 'length'
- javascript - SQL Server 的 TypeORM 连接问题
- javascript - 遇到此错误:未捕获的 TypeError:无法在 HTMLDivElement 处读取 null 的属性“classList”。
- javascript - 无法读取文件 imagick 异常
- python - 在两个 repos 中进行 git diff 并获得提交 ID 列表
- .net-core - 如何将 .NET Core 3.1 或 .NET 5 程序集转换为自包含二进制文件作为后期处理?
- kotlin - 如何在 Kotlin 中将电话号码转换为单词