Ruby on rails speichert ein spezifisches Feld in der Datenbank

7

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

    
heike 04.01.2011, 11:59
quelle

3 Antworten

17

Sie können einen genauen Satz von Feldern mit update_attributes aktualisieren.

%Vor%

Sie können ein einzelnes Feld mit update_attribute aktualisieren.

%Vor%     
DanSingerman 04.01.2011, 12:08
quelle
5

Es gibt mehrere Möglichkeiten, bestimmte Felder eines persistenten Objekts zu aktualisieren.

  • update(attributes)

      

    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.

  • update!(attributes)

      

    Aktualisiert seinen Empfänger wie ein Update, aber Anrufe speichern! Anstatt zu speichern, wird eine Ausnahme ausgelöst, wenn der Datensatz ungültig ist.

  • update_attribute(name, value)

      

    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.

    •   
    • Callbacks werden aufgerufen.

    •   Die Spalte
    • 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.

  • update_attributes(attributes)

      

    Alias ​​für update

  • update_attributes!(attributes)

      

    Alias ​​für update!

  • update_column(name, value)

      

    Entspricht update_columns(name => value)

  • update_columns(attributes)

      

    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.

    
Dennis 08.11.2014 12:45
quelle
1

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.

    
Veger 04.01.2011 12:07
quelle

Tags und Links