2011-01-11 13 views
4

BEARBEITEN: Ich habe diese Frage für die Klarheit total umgeschrieben. Ich habe vorher keine Kommentare und keine Antworten erhalten.Wie wird mit periodisch wechselnden Datenbankdaten in Ihrer Rails App umgegangen?

Ich führe eine 2.x Rails App mit vielen statistischen Daten. Einige Daten sind real und einige werden für die zukünftigen Jahre geschätzt. Jedes Jahr muss ich die geschätzten Daten mit echten Daten aktualisieren und neue Schätzungen berechnen.

Ich habe BIG-YML-Dateien und Migrationen verwendet, um die Daten jedes Jahr in die App zu laden. Meine Migrationen sind voll von Schätzberechnungen und Datenkorrekturen.


Problem

sind meine Migrationen voller keine Schema bezogenem Material, und ich kann db nicht einmal träumen tun: wandern: zurücksetzen, ohne einige Stunden zu warten (wenn es funktioniert auch). Ich würde es lieben, meine Migrationen schön und sauber zu sehen - nur mit schemabezogenen Modifikationen. Aber wie soll ich die Daten jedes Jahr aktualisieren, wenn ich keine Migrationen verwende?


Hilfe benötigt

Ich möchte Ihre Kommentare und Antworten hören. Ich bin nicht auf der Suche nach einer Silberkugel - mehr wie Best Practices und Ideen, wie Menschen mit ähnlichen Situationen umgehen.

+0

Hmmm, vielleicht sollte ich versuchen, diese Frage zu bearbeiten. Es ist ziemlich unordentlich. Auch ich möchte das nicht beantworten. Nun, ich habe Tumbleweed Abzeichen für diese :) – hade

+0

Ich habe diese Frage für Klarheit neu geschrieben. Alle Kommentare und Antworten werden sehr geschätzt! – hade

+0

+50 Kopfgeld hinzugefügt. – hade

Antwort

1

Es klingt wie Sie haben eine große Operation (Daten laden mit Yml-Dateien) einmal im Jahr, aber kleinere Operationen einmal im Monat.

Aus meiner Erfahrung mit statistischen Daten werden Sie wahrscheinlich mehr und mehr dieser Operationen ausführen, um mehr Daten zu bereinigen und hinzuzufügen.

Ich würde ein Job-Verarbeitung-Framework wie resque und resque scheduler verwenden.

Sie können die Jobs so planen, dass sie einmal im Monat, Jahr, Tag oder ständig ausgeführt werden. Ein Job ist etwas wie das Laden von YML-Dateien (oder Gruppen von YML-Dateien) oder das Bereinigen von Daten. Sie können Parameter steuern, die an Ihren Job gesendet werden, damit Sie eine Klasse verwenden können, aber abwägen, wie sie Ihre Daten basierend auf der Art und Weise, wie Sie den Job in die Warteschlange stellen oder planen, ändern oder bereinigen.

+0

danke! Ich mochte die Idee von Resque sehr. Ich werde das überprüfen. – hade

1

Zunächst muss ich sagen, dass dies eine sehr interessante Frage ist. Soweit ich weiß, ist es keine gute Idee, Daten von Migrationen zu laden. Im Allgemeinen sollten Sie db/seeds.rb für das Laden von Daten in Ihre Datenbank verwenden, und ich denke, es könnte eine gute Idee sein, einen kleinen Klassenhelfer zu schreiben, der in Ihr lib dir eingefügt wird und dann von db/same.rb aufruft. I Bild können Sie Dateien in der folgenden Art und Weise organisieren:

lib/data_loader.rb 
lib/years/2009.rb 
lib/years/2010.rb 

Natürlich sollten Sie Ihre Migrationen löschen und Code für lib/data_loader.rb in der Art und Weise schreiben Sie es vorziehen sollten, aber ich habe versucht, nur eine allgemeine anbieten Idee, wie ich meinen Code organisieren würde, wenn ich ein solches Problem habe.

Ich bin mir nicht sicher, ob ich auf Ihre Frage auf eine Weise geantwortet habe, die hilft, aber ich hoffe es tut es.

+0

danke für die Post! Ich habe verstanden, dass Samen hauptsächlich für die Eingabe von Anfangsdaten in die db verwendet werden. Ich habe nicht verstanden, wie sets.rb für die jährliche Aktualisierung von Daten verwendet werden kann. Mit diesem Ansatz, wie ich Rake db: Seed nennen sollte, sobald ich den db-Inhalt aktualisieren muss? – hade

+0

Gern können Sie Ihren "data_loader" so schreiben, wie er mit der "Jahressache" umgehen kann. Ich habe etwas wie "data_loader.load_current_year" gedacht, aber die andere Antwort gelesen, denke ich, dass du auch damit gehen solltest. Die Verwendung einer Aufgabe könnte sogar eine bessere Lösung sein. Sie sollten eine Aufgabe schreiben, bei der das Jahr als Parameter geladen wird. – lucapette

+0

Danke! [Nach DHH] (http://twitter.com/dhh/statuses/27425849821110272) sollte beim erstmaligen Einrichten der Datenbank der Seed verwendet werden. Das Problem ist, die samen.rb aktuell zu halten, wenn ich die Möglichkeit haben will, bei Null zu beginnen. Die anfängliche Datenart verändert sich ständig :) – hade

1

Wenn ich Sie wäre, würde ich mit dem Erstellen von benutzerdefinierten Rake-Aufgabe gehen. Sie haben Zugang zu allen Sie Modelle haben und Active Verbindungen und einmal im Jahr werden Sie am Ende tun:

rake calculate 
+0

Danke für die Antwort! Wenige Fragen. Über die Daten, wie würden Sie die neuen Daten mit Rake-Task laden? Verwenden von XML-Dateien? Ich habe vergessen, dass ich neben der BIG-Operation jedes Jahr kleinere Änderungen an den Daten (hauptsächlich Korrekturen) mache, vielleicht einmal im Monat. Mit Rake-Aufgaben würde ich am Ende einige Dutzend Rake-Aufgaben haben. Und ich müsste auch die Ausführungsreihenfolge verfolgen. – hade

0

ich eine Situation, wo ich brauche Daten aus CSV-Dateien zu laden, die selten und Aktualisierung von Daten aus dem Internet ändern Täglich. Ich werde ein etwas ausführlicheres Beispiel für die Durchführung des ersten Beispiels geben.


Zuerst habe ich eine Rake-Datei in lib/tasks/update.rake:

require 'update/from_csv_files.rb' 

namespace :update do 

    task :csvfiles => :environment do 
    Dir.glob('db/static_data/*.csv') do |file| 
     Update::FromCsvFiles.load(file) 
    end 
    end 

end 

Die => :environment bedeutet, dass wir Zugriff auf die Datenbank über die üblichen Modelle haben wird.

Dann habe ich Code in der Datei lib/update/from_csv_files.rb die eigentliche Arbeit zu tun:

require 'csv' 

module Update 
    module FromCsvFiles 

    def FromCsvFiles.load(file) 
     csv = CSV.open(file, 'r') 
     csv.each do |row| 
     id = row[0] 

     s = Statistic.find_by_id(id) 
     if (s.nil?) 
      s = Statistic.new 
      s.id= id 
     end 

     s.survey_area = row[1] 
     s.nr_of_space_men = row[2] 
     s.save 
     end 
    end 

    end 
end 

Dann kann ich nur rake update:csvfiles ausgeführt, wenn meine CSV-Dateien Änderungen die neuen Daten zu laden. Ich habe auch eine andere Aufgabe, die in ähnlicher Weise eingerichtet ist, um meine täglichen Daten zu aktualisieren.

In Ihrem Fall sollten Sie in der Lage sein, etwas Code zu schreiben, um Ihre YML-Dateien zu laden oder Ihre Berechnungen direkt zu machen. Um Ihre kleineren Korrekturen zu bearbeiten, können Sie eine generische Methode zum Laden von YML-Dateien erstellen und diese mit bestimmten Dateien aus der Rake-Task aufrufen. Auf diese Weise müssen Sie nur die YML-Datei hinzufügen und die Rake-Datei mit einer neuen Aufgabe aktualisieren. Um die Ausführungsreihenfolge zu verwalten, können Sie eine Rake-Aufgabe erstellen, die die anderen Rake-Aufgaben in der entsprechenden Reihenfolge aufruft. Ich werfe jetzt nur ein paar Ideen auf, du weißt es besser als ich.

+0

Danke @Gieron für die Antwort. Dies ist eine praktische Möglichkeit, mit CSV-Eingaben umzugehen. Nett! – hade

Verwandte Themen