2009-04-04 21 views
6

Estoy desarrollando una aplicación que necesita enviar mensajes de texto, por lo que tengo la información del operador almacenada en una base de datos. También necesito esa información en un archivo XML para leer el código del lado del cliente. Para que esto suceda, estoy escribiendo un script que lee la información del proveedor de la base de datos y crea un archivo XML en el directorio de configuración. Sentí que este script encajaría mejor en lib/tasks.¿Cómo accedo a mi base de datos de raíles desde una tarea en lib/tasks?

Necesito acceder a la base de datos desde este script, pero quiero usar algún objeto para acceder a él. Si uso

db = Mysql.new("domain", "username", "password", "database") 

Tendré que mantener múltiples versiones para diferentes entornos porque no uso MySQL todo el tiempo. Eso sería muy descuidado. Estoy seguro de que hay una manera de hacer esto. Traté simplemente acceder al objeto ... esto es lo que tengo hasta ahora:

RAILS_HOME = File.expand_path(File.join(File.dirname(__FILE__),"../..")) 
RAILS_CONFIG = "#{RAILS_HOME}/config" 

f = File.new("#{RAILS_CONFIG}/mls_widget_config.xml", "w") 
carriers = Carrier.find_all 
f.write carriers 
f.close 

Pero portador no está definido, lo cual tiene sentido. ¿Cómo puedo darle acceso a este script al objeto Carrier en el DB?

También como un lado, si alguien sabe cómo convertir fácilmente lo que leí de la base de datos en XML adecuado, sería genial. Iba a escribir algo personalizado muy rápido.

¡Gracias!

Respuesta

8

Puede activar una tarea Rake para acceder a sus modelos por la definición de su tarea como esta:

task :my_task => :environment do 
    # Task code 
end 

Nota del => :environment, que otorga este acceso. A continuación, puede instruir a su tarea Rake utilizar diferentes ambientes de esta manera:

rake RAILS_ENV=development my_task 
rake RAILS_ENV=production my_task 

En cuanto a la serialización XML, puede utilizar el incorporado en to_xml método, tales como:

Carrier.all.to_xml 

Tenga en cuenta que el método .all es una adición reciente a Rails, y es un alias para .find(:all).

2

En realidad estás casi allí; Yo acababa de recomendar que requiere el entorno de Rails como parte de la secuencia de comandos, así:

RAILS_HOME = File.expand_path(File.join(File.dirname(__FILE__),"../..")) 
RAILS_CONFIG = "#{RAILS_HOME}/config" 
require "#{RAILS_CONFIG}/environment" 

ahora usted debe tener acceso a toda la estructura de dominios. Rails también incluye la serialización XML predeterminada mediante el uso de la llamada al método to_xml; intente Carrier.find(:all).to_xml.

2

Por convención, lib/tasks generalmente se reserva para tareas de rake; es posible que desee colocar el código de su biblioteca en su propio directorio. lib/mensajes, tal vez?

¿Está ejecutando una versión anterior de Rails? find_all no funciona en las versiones recientes: 'find (: all)' o simplemente 'all' son los métodos actuales.

File.new("#{RAILS_ROOT}/mls_widget_config.xml", "w") do |f| 
    Carrier.all.each { |carrier| f.puts carrier.to_xml } 
end 
+0

Esto no explica cómo vincular a la clase de modelo, como se pregunta. – Tilendor

Cuestiones relacionadas