Gibt es eine Alternative zu update_attributes, bei der der Datensatz nicht gespeichert wird?
Also könnte ich so etwas machen wie:
@car = Car.new(:make => 'GMC')
#other processing
@car.update_attributes(:model => 'Sierra', :year => "2012", :looks => "Super Sexy, wanna make love to it")
#other processing
@car.save
Übrigens, ich weiß, dass ich es kann @car.model = 'Sierra'
, aber ich möchte sie alle in einer Zeile aktualisieren.
assign_attributes
SieAntworten:
Ich glaube, was Sie suchen, ist
assign_attributes
.Es ist im Grunde dasselbe wie update_attributes, speichert jedoch nicht den Datensatz:
quelle
attr_accessible :is_admin, :as => :admin
;)attr_protected :is_admin
. Oder:attr_accessible :name
Der Punkt ist, dass in diesem Beispiel: is_admin geschützt ist. Ich sollte auch beachten, dass der Versuch, ein geschütztes Attribut mit massenweise zuzuweisen,.assign_attributes
tatsächlich ein auslöstActiveModel::MassAssignmentSecurity::Error
, obwohl dies im Beispiel nicht gezeigt wird.user.assign_attributes({ :name => 'Josh', :is_admin => true })
eine Fehlermeldung ausgegeben wird und die Namenseigenschaft des Benutzers nicht festgelegt wird.Sie können
assign_attributes
oder verwendenattributes=
(sie sind gleich)Update Methoden Spickzettel (für Rails 6):
update
=assign_attributes
+save
attributes=
= Alias vonassign_attributes
update_attributes
= veraltet, Alias vonupdate
Quelle:
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_assignment .rb
Ein weiterer Spickzettel:
http://www.davidverhasselt.com/set-attributes-in-activerecord/#cheat-sheet
quelle
Sie können die Methode 'Attribute' verwenden:
Quelle: http://api.rubyonrails.org/classes/ActiveRecord/Base.html
Attribute = (new_attributes, guard_protected_attributes = true) Ermöglicht das aller Attribute durch Übergeben eines Hashs mit Schlüsseln, die mit den Attributnamen übereinstimmen (die wiederum mit den Spaltennamen übereinstimmen).
Wenn guard_protected_attributes true ist (Standardeinstellung), können vertrauliche Attribute mithilfe des attr_protected-Makros vor dieser Form der Massenzuweisung geschützt werden. Alternativ können Sie angeben, auf welche Attribute mit dem Makro attr_accessible zugegriffen werden kann. Dann dürfen nicht alle darin enthaltenen Attribute massenweise zugewiesen werden.
quelle
Verwenden Sie für die Massenzuweisung von Werten zu einem ActiveRecord-Modell ohne Speichern entweder die Methoden
assign_attributes
oderattributes=
. Diese Methoden sind in Rails 3 und neuer verfügbar. Es sind jedoch geringfügige Unterschiede und versionierungsbedingte Fallstricke zu beachten.Beide Methoden folgen dieser Verwendung:
Beachten Sie, dass keine der Methoden Überprüfungen durchführt oder Rückrufe ausführt. Rückrufe und Validierungen erfolgen, wenn
save
Aufruf.Schienen 3
attributes=
unterscheidet sich geringfügig vonassign_attributes
in Rails 3.attributes=
prüft, ob das an ihn übergebene Argument ein Hash ist, und gibt sofort zurück, wenn dies nicht der Fall ist;assign_attributes
hat keine solche Hash-Prüfung. Weitere Informationen finden Sie in der Dokumentation zur ActiveRecord-Attributzuweisungs-API fürattributes=
.Der folgende ungültige Code schlägt stillschweigend fehl, indem er einfach zurückgegeben wird, ohne die Attribute festzulegen:
attributes=
wird sich stillschweigend so verhalten, als ob die Zuweisungen erfolgreich durchgeführt wurden, obwohl dies wirklich nicht der Fall war.Dieser ungültige Code
assign_attributes
löst eine Ausnahme aus, wenn versucht wird, die Hash-Schlüssel des umschließenden Arrays zu stringifizieren:assign_attributes
löst eineNoMethodError
Ausnahme für ausstringify_keys
, die angibt, 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 sehr wichtig.Der einzige Unterschied zwischen diesen Fällen besteht in der Methode für die Massenzuweisung: Sie ist im
attributes=
Hintergrund erfolgreich undassign_attributes
löst eine Ausnahme aus, um zu informieren, dass ein Fehler aufgetreten ist.Diese Beispiele scheinen erfunden zu sein, und sie sind bis zu einem gewissen Grad, aber diese Art von Fehler kann leicht auftreten, wenn Daten von einer API konvertiert werden oder wenn einfach nur eine Reihe von Datentransformationen verwendet und
Hash[]
die Ergebnisse des Finales vergessen werden.map
. Behalten Sie den Code 50 Zeilen über und 3 Funktionen bei, die aus Ihrer Attributzuweisung entfernt wurden, und Sie haben ein Rezept für einen Fehler.Die Lektion mit Rails 3 ist dies: immer verwendet
assign_attributes
stattattributes=
.Schienen 4
In Schienen 4,
attributes=
ist einfach ein Alias zuassign_attributes
. Weitere Informationen finden Sie in der Dokumentation zur ActiveRecord-Attributzuweisungs-API fürattributes=
.Bei Rails 4 kann jede Methode austauschbar verwendet werden. Wenn ein Hash nicht als erstes Argument übergeben wird, führt dies zu einer sehr hilfreichen Ausnahme:
ArgumentError: When assigning attributes, you must pass a hash as an argument.
Validierungen
Wenn Sie in Vorbereitung auf a Aufgaben vor dem Flug ausführen, möchten
save
Sie möglicherweise auch vor dem Speichern validiert werden. Hierfür können Sie die Methodenvalid?
undinvalid?
verwenden. Beide geben boolesche Werte zurück.valid?
Gibt true zurück, wenn das nicht gespeicherte Modell alle Überprüfungen besteht, oder false, wenn dies nicht der Fall ist.invalid?
ist einfach das Gegenteil vonvalid?
valid?
kann wie folgt verwendet werden:Auf diese Weise können Sie Validierungsprobleme vor dem Anruf bearbeiten
save
.quelle