Object.update_attribute(:only_one_field, "Some Value")
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
Beide aktualisieren ein Objekt, ohne AR explizit anweisen zu müssen, es zu aktualisieren.
Rails API sagt:
für update_attribute
Aktualisiert ein einzelnes Attribut und speichert den Datensatz, ohne das normale Validierungsverfahren durchlaufen zu haben. Dies ist besonders nützlich für boolesche Flags in vorhandenen Datensätzen. Die reguläre update_attribute-Methode in Base wird durch diese ersetzt, wenn das Validierungsmodul eingemischt wird, was standardmäßig der Fall ist.
für update_attributes
Aktualisiert alle Attribute des übergebenen Hash und speichert den Datensatz. Wenn das Objekt ungültig ist, schlägt das Speichern fehl und false wird zurückgegeben.
Wenn ich das Objekt nicht validieren lassen möchte, sollte ich update_attribute verwenden. Was passiert, wenn ich dieses Update auf einem before_save habe, wird es überlaufen?
Meine Frage ist, ob update_attribute auch das vor dem Speichern oder nur die Validierung umgeht.
Was ist die richtige Syntax, um einen Hash an update_attributes zu übergeben? Schauen Sie sich mein Beispiel oben an.
quelle
update_attribute
Anweisung in einenbefore_save
Rückruf einfügen? Ich kann mir keinen guten Grund dafür vorstellen.before_save
Rückrufs festgelegt werden). Fe anstelle vonupdate_attribute(:discount, 0.1) if amount > 100
dir könnte tundiscount = 0.1 if amount > 100
.update_attribute
ruftsave
das Objekt auf, was in diesem Fall nicht erforderlich ist, da sich die Anweisung in einembefore_save
Rückruf befindet und trotzdem gespeichert wird. Ich hoffe das ergibt Sinn.Antworten:
Bitte beziehen Sie sich auf
update_attribute
. Wenn Sie auf Quelle anzeigen klicken, erhalten Sie den folgenden Codeund jetzt beziehen Sie
update_attributes
sich auf den Code, den Sie erhaltenDer Unterschied zwischen zwei ist
update_attribute
Verwendungen,save(false)
währendupdate_attributes
Verwendungensave
oder Sie können sagensave(true)
.Entschuldigung für die lange Beschreibung, aber was ich sagen möchte, ist wichtig.
save(perform_validation = true)
Wennperform_validation
falsch umgeht sie alle (überspringt wird das richtige Wort sein) Validierungen mit zugehörigensave
.Für die zweite Frage
Ihr Beispiel ist richtig.
oder
oder wenn Sie alle Felder Daten & Name in einem Hash erhalten, sagen Sie
params[:user]
hier nur verwendenquelle
Rails 3
. In den Kommentaren in der Quelle heißt es sehr deutlich, dass "Rückrufe aufgerufen werden".update_attributes
ist jetzt ein Alias fürupdate
Tipp: Wird
update_attribute
in Rails 4 über Commit a7f4b0a1 nicht mehr unterstützt . Es wirdupdate_attribute
zugunsten von entferntupdate_column
.quelle
update_attribute
Validierung überspringt, aber respektieren Rückrufe,update_column
werden sowohl die Validierung und Rückrufe und pflegen Updates überspringen:updated_at
,update
ist die normale Funktion , die beiden Rückrufe und Validierung respektierenupdate_column
ist nicht veraltet, wird aberupdate_columns(name: value)
bevorzugt.reset_column
wurde entfernt.update_attribute
Diese Methode aktualisiert ein einzelnes Objektattribut, ohne die modellbasierte Validierung aufzurufen.
update_attributes
Diese Methode aktualisiert mehrere Attribute eines einzelnen Objekts und besteht auch die modellbasierte Validierung.
Ich hoffe, diese Antwort klärt, wann welche Methode der aktiven Aufzeichnung verwendet werden soll.
quelle
Erwähnenswert ist auch, dass
update_attribute
das gewünschte zu aktualisierende Attribut nicht mit einer weißen Liste versehen werden mussattr_accessible
, um es zu aktualisieren, im Gegensatz zur Massenzuweisungsmethode, beiupdate_attributes
der nurattr_accessible
bestimmte Attribute aktualisiert werden.quelle
update_attribute
aktualisiert einfach nur ein Attribut eines Modells, aber wir können mehrere Attribute in derupdate_attributes
Methode übergeben.Beispiel:
Es besteht die Validierung
Es wird nicht aktualisiert, wenn die Validierung fehlschlägt.
quelle
Tolle Antworten. Beachten Sie, dass Sie für Ruby 1.9 und höher die neue Hash-Syntax für update_attributes verwenden können (und sollten).
quelle
Möglicherweise möchten Sie diesen Blog-Beitrag besuchen, in dem alle Möglichkeiten zum Zuweisen eines Attributs oder eines Aktualisierungsdatensatzes (aktualisiert auf Rails 4)
update_attribute, update, update_column, update_columns etc.
erläutert werden . Http://www.davidverhasselt.com/set-attributes-in-activerecord/ . Beispielsweise unterscheidet es sich in Aspekten wie dem Ausführen von Validierungen, dem Berühren des aktualisierten_at des Objekts oder dem Auslösen von Rückrufen.Als Antwort auf die Frage des OP
update_attribute
werden Rückrufe nicht umgangen.quelle
update_attribute
undupdate_attributes
sind ähnlich, aber mit einem großen Unterschied:update_attribute
führt keine Validierungen durch.Ebenfalls:
update_attribute
wird verwendet, um den Datensatz mit einem einzelnen Attribut zu aktualisieren .update_attributes
wird verwendet, um den Datensatz mit mehreren Attributen zu aktualisieren .Diese beiden Methoden sind aufgrund ihrer ähnlichen Namen und Werke sehr leicht zu verwechseln. Daher
update_attribute
wird zugunsten von entferntupdate_column
.Nun, in Rails4 können Sie verwenden ,
Model.update_column(:column_name, column_value)
am Ort derModel.update_attribute(:column_name, column_value)
Klicken Sie hier , um weitere Informationen zu erhalten
update_column
.quelle
Um Ihre Frage zu beantworten,
update_attribute
überspringen Sie vor dem Speichern "Validierungen", aber es werden immer noch andere Rückrufe wie ausgeführtafter_save
usw. ausgeführt. Wenn Sie also wirklich "nur die Spalte aktualisieren und eine AR-Cruft überspringen" möchten, müssen Sie (anscheinend) verwenden.Model.update_all(...)
Siehe https://stackoverflow.com/a/7243777/32453quelle
Kürzlich bin ich auf ein
update_attribute
vs.update_attributes
und Validierungsproblem gestoßen, also ähnliche Namen, so unterschiedliches Verhalten, so verwirrend.Um die Hash-
update_attribute
Validierung zu übergeben und die Validierung zu umgehen, haben Sie folgende Möglichkeiten:quelle
Ich denke, Ihre Frage ist, ob ein update_attribute in einem before_save zu einer Endlosschleife führt (von update_attribute-Aufrufen in before_save-Rückrufen, die ursprünglich durch einen update_attribute-Aufruf ausgelöst wurden).
Ich bin mir ziemlich sicher, dass es den before_save-Rückruf umgeht, da es den Datensatz nicht wirklich speichert. Sie können einen Datensatz auch speichern, ohne Validierungen mit auszulösen
Model.save false
quelle