как запустить грабли с помощью миграции rails - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу запустить задачу 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

пожалуйста, руководство, что будет миграция, которая запустит эту задачу, любое тело здесь, кто спасет мою жизнь ??

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Вы можете пойти, как @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
0 голосов
/ 04 декабря 2018

Если вы хотите запустить свою задачу после того, как вы автоматически запустите 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

Для приложения на рельсах вы можете разместить его где угодновнутри папки lib/tasks или поместите задачу (внутри блока .enhance do)

0 голосов
/ 03 декабря 2018

Миграции - это на самом деле просто файлы Ruby, следующие соглашению, поэтому, если вы хотите запустить в них задачу rake, вы можете использовать стандартное соглашение Ruby.

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

Ссылки:

...