Para uno de los proyecto en los que estoy trabajando he creado una migración y una task para migrar unos datos. En concreto he usado, no se si llamarle pattern, counter_cache en una asociación entre modelos para evitar el problema de N+1 queries. Hasta ahí todo normal.
Lo curioso es que a la hora de publicar a producción la nueva versión he encontrado una manera de lanzar la task dentro de la migración. Así con una simple llamada de capistrano se ejecuta todo y no tengo que acceder al server a ejecutar la task manualmente. Os pongo el ejemplo:
class AddCommentsCountToArticle < ActiveRecord::Migration[5.0]
def change
add_column :articles, :comments_count, :integer, default: 0
reversible do |dir|
dir.up do
Rake::Task['model:reset_counters'].invoke
end
end
end
end
La clave está en llamar (invocar) la task dentro de este código:
reversible do |dir|
dir.up do
Rake::Task['namespace:taskname'].invoke
end
end
Donde namespace
es le namespace de la task y taskname
el nombre que le hayas dado a tu task. Así de fácil.
:P