Ich habe eine Tabelle in meiner Datenbank, die Haus ist, die viele Felder wie "Farbe", "Preis" hat. Wie kann ich nach der Aktualisierung nur ein bestimmtes Feld speichern?
wenn ich das habe,
@ house.colour = neueFarbe
@ house.save
es speichert alle anderen Feld einschließlich house.colour und house.price
(mein Fall, Preis sollte programmatisch zur gleichen Zeit mit der Farbe aktualisiert werden, sollte aber nicht gespeichert werden. nur house.colour sollte sein in der Datenbank gespeichert)
Ich habe es versucht
@ house.colour = neueFarbe
@ house.colour.save
aber es zeigt mir Fehler
Ist es möglich, nur den Wert von @ house.colour zu speichern?
Danke für jeden Vorschlag
Sie können einen genauen Satz von Feldern mit update_attributes aktualisieren.
%Vor%Sie können ein einzelnes Feld mit update_attribute aktualisieren.
%Vor%Es gibt mehrere Möglichkeiten, bestimmte Felder eines persistenten Objekts zu aktualisieren.
Aktualisiert die Attribute des Modells aus dem übergebenen Hash und speichert den Datensatz in einer Transaktion. Wenn das Objekt ungültig ist, wird das Speichern fehlschlagen und false wird zurückgegeben.
Aktualisiert seinen Empfänger wie ein Update, aber Anrufe speichern! Anstatt zu speichern, wird eine Ausnahme ausgelöst, wenn der Datensatz ungültig ist.
Aktualisiert ein einzelnes Attribut und speichert den Datensatz. Dies ist besonders nützlich für boolesche Flags in bestehenden Datensätzen. Beachten Sie auch, dass
Die Validierung wird übersprungen.
- Die Spalte
Callbacks werden aufgerufen.
aktualisierte_at / aktualisierte_on wird aktualisiert, wenn diese Spalte verfügbar ist.
Aktualisiert alle Attribute, die in diesem Objekt fehlerhaft sind.
Diese Methode löst einen
ActiveRecord::ActiveRecordError
aus, wenn das Attribut schreibgeschützt ist.
Alias für
update
update_attributes!(attributes)
Alias für
update!
Entspricht
update_columns(name => value)
Aktualisiert die Attribute direkt in der Datenbank, die eine UPDATE SQL-Anweisung ausgeben und setzt sie im Empfänger.
Dies ist der schnellste Weg, um Attribute zu aktualisieren, da sie direkt in die Datenbank gehen, aber dabei berücksichtigen, dass die regulären Update-Prozeduren vollständig umgangen werden. Insbesondere:
Validierungen werden übersprungen.
Rückrufe werden übersprungen.
updated_at / updated_on werden nicht aktualisiert.
Diese Methode löst einen
ActiveRecord::ActiveRecordError
aus, wenn neue Objekte aufgerufen werden, oder wenn mindestens eines der Attribute als schreibgeschützt markiert ist.
update
und update!
(und daher update_attributes
und update_attributes!
) rufen Sie save
auf. In Ihrer Situation sollten Sie also update_column
oder update_columns
verwenden.
Die Antwort von DanSingerman zeigt, wie man ein einzelnes Feld aktualisiert.
Aber, wenn der Preis ein rein berechneter Wert ist, sollte es kein Feld in Ihrer Tabelle sein. Aber eine Methode in Ihrem Modell:
%Vor%(Dies ist offensichtlich eine sehr einfache Methode, um einen Preis zu berechnen)
Jetzt können Sie @house.price
wie zuvor verwenden und es hängt von der Farbe ab, aber es ist kein Tabellenfeld mehr.
Hinweis: Wenn die Berechnung komplex ist, können Sie sie in der Klassenvariablen "zwischenspeichern" und die Methode colour=
überschreiben, um die Klassenvariable zu löschen, wenn sich die Farbe ändert.
Tags und Links ruby ruby-on-rails