2009-04-04 6 views
6

Ich entwickle eine App, die Textnachrichten senden muss, damit ich Trägerinformationen in einer Datenbank gespeichert habe. Ich brauche diese Informationen auch in einer XML-Datei, damit der clientseitige Code gelesen werden kann. Um dies zu erreichen, schreibe ich ein Skript, das die Trägerinformationen aus der DB liest und eine XML-Datei im config-Verzeichnis erstellt. Ich dachte, dieses Script würde am besten in lib/task passen.Wie greife ich von einer Aufgabe in lib/tasks auf meine Rails-Datenbank zu?

Ich muss von diesem Skript auf die Datenbank zugreifen, aber ich möchte ein Objekt verwenden, um darauf zuzugreifen. Wenn ich verwende

Ich muss mehrere Versionen für verschiedene Umgebungen halten, weil ich MySQL nicht die ganze Zeit verwenden. Das wäre sehr schlampig. Ich bin mir sicher, dass es einen Weg gibt, dies zu tun. Ich habe gerade versucht, auf das Objekt zugreifen ... das ist, was ich bisher:

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 

Aber Carrier ist nicht definiert, was Sinn macht. Wie kann ich diesem Skript Zugriff auf das Carrier-Objekt in der DB geben?

Auch als eine Seite, wenn jemand weiß, wie einfach, was ich aus der DB in richtige XML konvertieren, das wäre toll. Ich wollte wirklich schnell etwas Brauchbares schreiben.

Vielen Dank!

Antwort

8

Sie können eine Rake Aufgabe aktivieren, um Ihre Modelle zugreifen, indem Sie Ihre Aufgabe wie folgt definieren:

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

Hinweis die => :environment, die diesen Zugang gewährt. Anschließend können Sie Ihre Rake Aufgabe anweisen, verschiedene Umgebungen auf diese Weise zu verwenden:

rake RAILS_ENV=development my_task 
rake RAILS_ENV=production my_task 

Wie für die XML-Serialisierung, können Sie die eingebaute in to_xml Methode verwenden, wie zum Beispiel:

Carrier.all.to_xml 

Beachten Sie, dass das Verfahren .all ist eine neue Ergänzung zu Rails und ist ein Alias ​​für .find(:all).

2

Sie sind eigentlich fast da; Ich würde nur empfehlen Ihre Rails-Umgebung als Teil des Skripts erfordern, etwa so:

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

Jetzt haben Sie Zugriff auf alle Ihre Domänenstruktur haben sollte. Rails enthält außerdem die Standard-XML-Serialisierung mithilfe des Methodenaufrufs to_xml. versuchen Sie Carrier.find(:all).to_xml.

2

Per Konvention ist lib/tasks normalerweise für Rake-Aufgaben reserviert - Sie könnten Ihren Bibliothekscode in einem eigenen Verzeichnis speichern. lib/messaging, vielleicht?

Laufen Sie eine alte Version von Rails? find_all funktioniert in neueren Versionen nicht: 'find (: all)' oder einfach 'all' sind heutzutage die Methoden.

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

Dies erklärt nicht, wie Sie mit der Modellklasse verknüpfen, wie die Frage fragt. – Tilendor