Descubriendo las rake tasks

Hasta hace poco sólo habí­a usado rake para cosas tí­picas como

rake db:migrate
rake annotate_models

y otras de las que ya vienen definidas el Rails o en los plugins que instalo.

Pero para aprender a integrar los mapas de Google en el Directorio de Economí­a Social me hice con el libro "Beginning Google Maps Applications with Rails and Ajax" y ahí­ los ejemplos de geocodificación son con tareas rake, con lo que empecé a verles el enorme potencial que tienen. En la web de Railscasts hay un screencast bastante interesante sobre esto: Custom Rake Tasks.

Un ejemplo de geocodificacion de direcciones de empresas en el Directorio (fichero lib/tasks/geocode_empresas.rake):

task :geocode_empresas => :environment do
  api_key=GOOGLE_MAPS_API_KEY

  Empresa.find(:all).each do |empresa|
   begin   
    if empresa.geocode_status == nil
      empresa.geocode
      puts "Empresa: #{empresa.nombre}"
      puts "Dirección: #{empresa.direccion_completa}"
      puts "geocode_status: #{empresa.geocode_status}"
      puts "--"
    end
   rescue Exception => e
     puts "Empresa: #{empresa.nombre}"
     puts "Dirección: #{empresa.direccion_completa}"
     puts "--Excepción--"
     puts e
   end
  end # end each store
end # end rake task

Como es algo que puede tardar y no querí­a dejar al usuario esperando a que geocodificase su dirección al guardar la ficha de empresa, es algo que se hace desde la tarea rake, ya sea desde cron o lí­nea de comnados en cualquier momento con:

rake geocode_empresas

Le cogí­ el gustillo y también las he usado para el BuscaBoe y son una buena opción para realizar tareas periódicas con cron. Si es una funcionalidad que se vaya a usar desde otra parte de la aplicación Rails lo nejor es sacarla a una librerí­a y luego en la rake task llamar a las funciones que hagan falta:

Ejemplo de buscaboe:

require 'buscaboe'
task :buscaboe => :environment do
  fecha = Date.today
  begin
    BuscaBoe.buscar(fecha)
  rescue
 end
end # end rake task

Para hacer lo mismo pero para un rango de fechas:

require 'buscaboe'
task :buscaboe_antiguos => :environment do
  for fecha in Date.new(2007,10,1)..Date.new(2007,10,11)
    begin
      BuscaBoe.buscar(fecha)
    rescue
      puts "--excepcion--"
    end # begin - rescue
  end # for fecha 
end # end rake task

Comentarios

Mola un montón, gracias por descubrirme las rake tasks. Las integraré en Pagerankalert y Boris, es mejor opción que usar script/runner cada minuto por poder hacer varias tareas de golpe en una sola ejecución.

Añadir nuevo comentario