【问题标题】:how to run rake task using rails migration如何使用 Rails 迁移运行 rake 任务
【发布时间】:2018-12-03 20:34:44
【问题描述】:

我想使用迁移运行 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

请指导执行此任务的迁移是什么,这里有谁可以救我的命??

【问题讨论】:

  • 如果您打算使用迁移,为什么要在此处使用 rake 任务?这些updates 本身可以成为迁移的一部分
  • 因为这是我客户的要求,所以我需要这个。

标签: ruby-on-rails ruby ruby-on-rails-5 rails-migrations


【解决方案1】:

迁移实际上只是遵循约定的 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

参考资料:

【讨论】:

  • 我用的是PGSql,能不能按照这个转换成?
  • 当然,我更新了它。我不知道您的 logs 表的名称是什么,因此您可能需要相应地更改它。这是我使用的参考:oreilly.com/library/view/practical-postgresql/9781449309770/…
  • 运行只是从 SQL 命令中删除表。谢谢它工作正常。
  • @JosephCho 为合适的人投票。 :)
【解决方案2】:

如果您想在自动运行db:migrate 之后运行您的任务,您可以使用enhance

Rake::Task['db:migrate'].enhance do
  # This task runs after every time you run `db:migrate`
  Rake::Task['task_for_log:set_by_default_date_of_log'].invoke
end

对于 Rails 应用程序,您可以将其放在 lib/tasks 文件夹中的任何位置,或者将您的任务内联(在 .enhance do 块内)

【讨论】:

    【解决方案3】:

    你可以像@joseph 提到更好的解决方案一样去!或者为它创建自定义任务。

    耙子:

    rake cm:set_by_default_date_of_log
    

    任务:

    #lib/tasks/cm.rake
    #custom_migration
    namespace :cm 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: ['db:migrate'] do
        Log.where("log_date IS NULL").each do |log|
          log.update_attributes(log_date: log.created_at.to_date)
        end
      end
    end
    

    【讨论】:

    • 但是我的客户这种方法不好,因为我们必须通过手动命令来运行这个任务,因此我们必须在这个任务运行的地方制作一个迁移文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2012-07-15
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多