Für die Massenzuweisung von Werten zu einem ActiveRecord-Modell ohne Speichern verwenden Sie entweder die assign_attributes
o attributes=
Methoden. Diese Methoden sind in Rails 3 und neueren Versionen verfügbar. Es gibt jedoch geringfügige Unterschiede und versionsbedingte Probleme, die zu beachten sind.
Beide Methoden folgen dieser Verwendung:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }
@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
Beachten Sie, dass keine der beiden Methoden Überprüfungen durchführt oder Rückrufe ausführt; Rückrufe und Überprüfungen werden durchgeführt, wenn save
genannt wird.
Schiene 3
attributes=
unterscheidet sich leicht von assign_attributes
in Rails 3. attributes=
prüft, ob das übergebene Argument ein Hash ist, und gibt sofort zurück, wenn dies nicht der Fall ist; assign_attributes
hat keine solche Hash-Prüfung. Siehe die ActiveRecord-Attribut-Zuordnung API-Dokumentation für attributes=
.
Der folgende ungültige Code schlägt fehl, indem er einfach zurückkehrt, ohne die Attribute zu setzen:
@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
attributes=
verhält sich stillschweigend so, als seien die Zuweisungen erfolgreich durchgeführt worden, obwohl dies in Wirklichkeit nicht der Fall war.
Dieser ungültige Code wird eine Ausnahme auslösen, wenn assign_attributes
versucht, die Hash-Schlüssel des umschließenden Arrays zu stringifizieren:
@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
assign_attributes
wird eine NoMethodError
Ausnahme für stringify_keys
und zeigt damit an, dass das erste Argument kein Hash ist. Die Ausnahme selbst ist nicht sehr informativ über die tatsächliche Ursache, aber die Tatsache, dass eine Ausnahme auftritt, ist très wichtig.
Der einzige Unterschied zwischen diesen Fällen ist die Methode der Massenzuordnung: attributes=
gelingt stillschweigend, und assign_attributes
löst eine Ausnahme aus, um zu informieren, dass ein Fehler aufgetreten ist.
Diese Beispiele mögen konstruiert erscheinen, und das sind sie bis zu einem gewissen Grad auch, aber diese Art von Fehler kann leicht auftreten, wenn man Daten aus einer API konvertiert oder auch nur eine Reihe von Datentransformationen verwendet und vergisst, die Hash[]
die Ergebnisse der Abschlussprüfung .map
. Pflegen Sie einen Code, der 50 Zeilen höher und 3 Funktionen von Ihrer Attributzuweisung entfernt ist, und Sie haben ein Rezept für einen Fehlschlag.
Die Lektion mit Rails 3 ist diese: immer utilice assign_attributes
anstelle von attributes=
.
Schienen 4
In Rails 4, attributes=
ist einfach ein Alias für assign_attributes
. Siehe die ActiveRecord-Attribut-Zuordnung API-Dokumentation für attributes=
.
Mit Rails 4 können beide Methoden austauschbar verwendet werden. Wird kein Hash als erstes Argument übergeben, führt dies zu einer sehr hilfreichen Ausnahme: ArgumentError: When assigning attributes, you must pass a hash as an argument.
Validierungen
Wenn Sie Aufgaben zur Vorbereitung auf eine Flugreise erledigen save
können Sie auch die Validierung vor dem Speichern in Betracht ziehen. Sie können die valid?
y invalid?
Methoden dafür. Beide geben boolesche Werte zurück. valid?
gibt true zurück, wenn das nicht gespeicherte Modell alle Validierungen besteht, oder false, wenn es nicht besteht. invalid?
ist einfach der Kehrwert von valid?
valid?
kann wie folgt verwendet werden:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?
Dies gibt Ihnen die Möglichkeit, alle Validierungsprobleme vor dem Aufruf von save
.