ActiveRecord parse string in datetime?
Wenn ich passieren eine String
in Datetime
Spalte, während die Schaffung neuer AR-Objekt, wird es automatisch Parsen:
1.9.2p290 :011 > Movie.new(:release_date=>"21-Nov-1990")
=> #<Movie id: nil, release_date: "1990-11-21 00:00:00", created_at: nil, updated_at: nil>
Wie funktioniert Rails
oder ActiveRecord
, tun diese Magie? Welche Methode benutzt?
- Ich merke auch, dass die
Date
Spalte Verhalten sich auf die gleiche Weise wenn ich eine Zeichenfolge übergeben, um es. Ich fand, dass es einecast_value(value)
Methode inrails/activemodel/lib/active_model/type/date.rb
(im Gesicht gibt es vielecast_value(value)
Methoden für jeden Typ, die in active model), callfast_string_to_date(value)
oderfallback_string_to_date(value)
Methoden, wenn der Wert ein String ist. Ich denke, diecast_value
lass dich von ActiveModel, bevor Sie den Datensatz speichern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schienen fügt eine
to_date
MethodeString
. Seine Quelle ist einfach:Date._parse
native Ruby (die gleiche Methode wird aufgerufen, durchDate.parse
) und es ist wo die eigentliche Arbeit ist getan.Ersten, die es verwendet einen regulären Ausdruck, entfernen überflüssige Zeichen aus dem string, übergibt Sie dann an andere Methoden wie
_parse_eu
,_parse_iso
,_parse_dot
und so weiter. Jede dieser verwendet seine eigene reguläre Ausdrücke und andere Methoden, um zu sehen, ob es ein Datum, das es versteht, und extrahieren Sie die aussagekräftige Informationen aus. Sobald einer von Ihnen "funktioniert" (d.h. Sie gibt true zurück), der rest wird übersprungen. Schließlich, zurück in_parse
, die extrahierte information wird genutzt, um ein Datum und Zeit, dabei ein wenig mehr Arbeit, um herauszufinden, Dinge wie die überprüfung für den Tag der Woche und ob ein Jahr mit dem Wert von "12" bedeuten sollte, 1912 oder 2012.Die docs nennen das eine heuristische Methode, die ergriffen werden könnten, bedeuten, es wirft eine Reihe von Möglichkeiten an die Wand, um zu sehen, was klebt. Es ist ziemlich schlecht dokumentiert, funktioniert aber erstaunlich gut.
Gibt es auch
to_datetime
wenn Sie brauchen Sie die Zeit.Die Sie wahrscheinlich verwenden wollen
Date.strptime(str)
.strptime
hat, dass das Datum-format, sonst würde es die Standard-format. Aber AR kann magisch analysieren von Daten in mehreren Formaten.Als andere Kommentare und die Dokumentation empfiehlt, String#to_datetime "Konvertiert eine Zeichenfolge in einen DateTime-Wert.":