2010-07-26 6 views
5

Ich habe mit einem Problem ausgeführt, das ich glaube, ist Active Records Fehler. Ich analysiere eine XML-Datei, die Jobs enthält. Diese XML-Datei enthält Knoten, die die Wandzeit im Zeitformat 00:00:00 angeben. Ich habe auch ein Modell, das diese Jobs annehmen wird. Wenn die Zeit jedoch größer als eine tatsächliche 24-Stunden-Zeit ist, fügt Active Record sie als NULL ein. Beispiele unten:Einfügen von Zeit in eine Zeitspalte mit Ruby on Rails

INSERT INTO `jobs` (`jobid`, `walltime`) VALUES('71413', 'NULL') 

INSERT INTO `jobs` (`jobid`, `walltime`) VALUES('71413', '15:24:10') 

Irgendwelche Ideen? Vielen Dank!

+0

was ist Ihr Problem finden Sie bitte im Detail erklären? Es gibt Fehler, oder was? – Salil

+0

Ist 'walltime' in Ihrer Datenbank so konfiguriert, dass Varchar oder Text akzeptiert wird? Oder ist es ein magisch formatierter Zeittyp? (Wenn dies meine Anwendung wäre, würde ich die Anzahl der Sekunden als Integer in der Datenbank speichern und die Formatierung der Ansicht überlassen.) – sarnold

+1

Auf welcher Datenbank läuft sie? Wenn es MySQL ist und das walltime-Attribut vom Typ Time ist, könnte dies ein interessanter Haken sein, da MySQL in der Lage ist, die verstrichene Zeit über den Typ Zeit zu verarbeiten. In diesem Fall sollte ActiveRecord das walltime-Attribut nicht auf NULL schreiben. –

Antwort

5

Die Standard SQL time und datetime Datentypen sind nicht zum Speichern einer Dauer vorgesehen. Wahrscheinlich in Übereinstimmung mit diesen Standards verwendet ActiveRecord's time attribute assignment logic die time parsing rules of the native Ruby Time class, ungültige Uhrzeit abzulehnen.

Die Art und Weise Dauer zu speichern, wie Sie beabsichtigen, ist entweder:

  1. Speichern Sie die Dauer als eine ganze Zahl (zB „Anzahl von Sekunden“) oder
  2. Shop zwei (Datum) Zeiten ein Anfang und Ende, und verwenden Sie Datum Arithmetik für sie.
class Thing < ActiveRecord::Base 
    ... 
    def duration 
    return start - end 
    end 

    def duration=(length) 
    start = Time.now 
    end = start + length 
    end 
    ... 
end 
+1

Dies ist nicht der Fall für MySQl (weiß nicht über andere Implementierungen). Siehe hier: http://dev.mysql.com/doc/refman/5.0/en/time.html ("... Werte können zwischen -838: 59: 59" bis "838: 59: 59" liegen. Der Stundenabschnitt kann so groß sein, da der TIME-Typ nicht nur zur Darstellung einer Tageszeit (die weniger als 24 Stunden sein muss), sondern auch der verstrichenen Zeit oder eines Zeitintervalls zwischen zwei Ereignissen (die viel größer als sein können) verwendet werden kann 24 Stunden, oder sogar negativ). ") –

+0

Hi Milan - ja, MySql kann durchaus Duration-Storage in einer Time-Spalte unterstützen - aber da Active Record cross-db-kompatibel sein soll - kann es immer noch" hilfreich "die Zeit interpretieren als Uhr-nur-Zeit. Es würde daher weiterhin alles ausgleichen, was es als "ungültige Zeit" ansieht. Daher ist die Dauer Option hier wahrscheinlich eine bessere Wette um sicherzustellen, dass es tatsächlich funktioniert. –

+1

@Taryn Aufgrund unseres Verdachts fand ich den Code, der genau das tut. –