Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用rails迁移运行rake任务_Ruby On Rails_Ruby_Ruby On Rails 5_Rails Migrations - Fatal编程技术网

Ruby on rails 如何使用rails迁移运行rake任务

Ruby on rails 如何使用rails迁移运行rake任务,ruby-on-rails,ruby,ruby-on-rails-5,rails-migrations,Ruby On Rails,Ruby,Ruby On Rails 5,Rails Migrations,我希望使用迁移来运行rake任务,因为我们希望当用户运行railsdb:migrate时,该任务将通过迁移来运行 我的任务是: 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_d

我希望使用迁移来运行rake任务,因为我们希望当用户运行
railsdb:migrate
时,该任务将通过迁移来运行

我的任务是:

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
class ExampleMigation
但是,迁移文件应专门用于处理数据库架构。我会重新考虑你是如何处理这个问题的,以便找到更好的解决办法。例如,您可以运行更新日志属性的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
class ExampleMigation执行你可以像@joseph一样提到更好的解决方案!或者为其创建自定义任务

耙子: 任务:
如果要在自动运行
db:migrate
后运行任务,可以使用
enhanced

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
文件夹中的任何位置,或者将任务内联(放在
.enhanced do
块中)

如果您打算使用迁移,为什么要在此处使用rake任务?这些
更新本身可以是迁移的一部分,因为这是我的客户的要求,因此我需要它。我正在使用PGSql,您可以根据此转换吗?当然,我更新了它。我不知道您的
日志
表的名称,因此您可能需要相应地更改它。下面是我使用的参考:runjustremovetablefromsql命令。谢谢,它很好用。@JosephCho投了一张合适的票。:)但是我的客户机这种方法不好,因为我们必须通过手动命令运行此任务,因此我们必须在运行此任务的位置创建一个迁移文件
#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
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