¿Cómo ejecuto las tareas de Ruby que usan mis modelos de Rails?

Tengo una aplicación Rails con algunos modelos básicos. El sitio web muestra los datos recuperados de otras fonts. Así que necesito escribir un script Ruby que cree nuevas instancias en mi base de datos. Sé que puedo hacer eso con los ganchos de prueba, pero no estoy seguro de que tenga sentido aquí.

No estoy seguro de cómo debería ser esta tarea, cómo puedo invocarla o dónde debería ir en mi árbol de origen (lib \ tasks?).

Por ejemplo, aquí está mi primer bash:

require 'active_record' require '../app/models/mymodel.rb' test = MyModel.new test.name = 'test' test.save 

Esto falla porque no puede obtener una conexión a la base de datos. Esto tiene sentido de una manera vaga para mi cerebro de novato, ya que presumiblemente Rails está haciendo todo el trabajo mágico detrás de la escena para configurar todo eso. Entonces, ¿cómo puedo configurar mi pequeño script?

Estoy de acuerdo con la respuesta anterior, pero debe incluir el entorno =>: en su tarea o no cargará el entorno de Rails.

p.ej,

 namespace :send do namespace :trial do namespace :expiry do desc "Sends out emails to people who's accounts are about to expire" task :warnings => :environment do User.trial_about_to_expire.has_not_been_notified_of_trial_expiry.each do |user| UserMailer.deliver_trial_expiring_warning(user) user.notified_of_trial_expiry = true user.save end end end end end 

Puede cargar todo el entorno de Rails en cualquier script de ruby ​​simplemente requiriendo environment.rb:

 require "#{ENV['RAILS_ROOT']}/config/environment" 

Esto supone que la variable de entorno RAILS_ROOT está establecida, vea mi comentario para otras formas de hacer esto.

Esto tiene la ventaja adicional de brindarte todas las clases y objetos agradables que tienes en el rest del código de Rails.

Para iniciar sus procesos, parece que cron hará lo que usted quiere, y también agregaría una tarea a su receta de capistrano que agregaría su script a crontab para obtener periódicamente los datos de la fuente externa y actualizar su base de datos. Esto se puede hacer fácilmente con la gem cronedit .

El enfoque cron tiene algunos inconvenientes, en su mayoría gastos generales y de control, ya que otras opciones más sofisticadas ven HowToRunBackgroundJobsInRails de la wiki de Rails.

Sugeriría crear tareas de rake personalizadas (lib / task / foo.rake). Esto le permite acceder fácilmente a la mayoría de las funciones de su aplicación Rails.

 namespace :foo do desc 'do something cool' def something_cool test = MyModel.new test.name = 'test' test.save end end 

Entonces:

 $ rake -T foo rake foo:something_cool # do something cool 

Incluso puede ejecutar las tareas a través de un cronjob.

Puedes abrir una conexión en tus scripts como tal:

 ActiveRecord::Base.establish_connection( :adapter => "mysql", :username => "root", :host => "localhost", :password => "******", :database => "******" ) 

Estoy seguro de que hay una forma más elegante de hacerlo, para que obtenga la información de su archivo database.yml.

Hay pocos pasos para esto y se necesitan más detalles para responder realmente bien.

¿Dices que tu sitio recupera datos de otras fonts? ¿Con qué frecuencia? Si es semipreparable, definitivamente desea analizar el procesamiento / mensajería en segundo plano. Si es frecuente, realmente desea evitar cargar su entorno de Rails cada vez que se ejecuta su script, ya que pagará un impuesto de inicio demasiado alto cada vez.

Hay una multitud de opciones que querrás investigar. Leer sobre cada uno de ellos, en particular las críticas de las personas que publican sobre por qué hicieron la elección que hicieron, le dará una idea de las preguntas que debe hacerse antes de hacer su elección. ¿Qué tan grande es un trabajo cargando los datos? etc …

Desde la parte superior de mi cabeza, estas son algunas de las cosas que quizás desee analizar.

Script / Runner & Cron Background / RB Starling Workling MemcacheQ Beanstalk Background Job (Bj) delayed_job (Dj) Daemon Generator

Echa un vistazo a mi respuesta en ” Un trabajo cron para Rails: ¿mejores prácticas? “.

Contiene dos ejemplos para usar cron para ejecutar tareas de Rake y métodos de clase (a través de script/runner ). En ambos casos, Rails está cargado y puede usar sus modelos.

Nice Joyent escribe sobre el uso de rake para ejecutar tareas de Rails desde un trabajo cron: http://wiki.joyent.com/accelerators:kb:rails:cron

La forma más sencilla de ejecutar tareas de ruby ​​que interactúan con la aplicación / modelo de Rails es hacer que Rails genere tareas de Rake para ti. 🙂

Aquí un ejemplo

  1. ejecutar rails g task my_namespace my_task

  2. Esto generará un archivo llamado lib/tasks/my_namespace.rake que se ve así:

 namespace :my_namespace do desc "TODO: Describe your task here" task :my_task1 => :environment do #write any ruby code here and also work with your models puts User.find(1).name end end 
  1. Ejecuta esta tarea con rake my_namespace:my_task

  2. ¡Mire su tarea de código ruby ​​que interactúa con Rails modal run!