2013-11-27 10 views
18

Ich stoße auf ein seltsames Problem, das meinerseits ein Benutzerfehler sein muss, aber ich kann es nicht herausfinden.Wie kann ich den Wert eines Datensatzes mit Ruby on Rails 4.0.1/PostgreSQL Hstore aktualisieren?

Ich benutze Ruby 1.9.3-p194, Rails 4.01, PostgreSQL.

Ich habe ein Modell, Kunden, mit einer Spalte Daten genannt, die eine Art hstore ist. Aus irgendeinem Grund kann ich die Datenspalte (Hstore) weder mit neuen Schlüsseln/Werten aktualisieren noch den Wert eines vorhandenen Schlüssels aktualisieren. Ich kann eine Einfügung machen und irgendwelche Schlüssel/Werte ohne irgendein Problem spezifizieren.

Kunden-ID: 1, Vorname: "Mark", Nachname: "Test", Daten: {"Balance" => "0"}, created_at: "2013-11-27 14:39:09", updated_at : "2013.11.27 14.39.09"

c.data["balance"] = "100" 

c.save 

(0,2 ms)

(0,3 ms) BEGIN COMMIT = true>

Wenn ich ein update_attributes tun, es tut Speichere es.

c.update_attributes({:data => {"balance" => "343"}}) 

ich keine Fehler oder Ausnahmen sehen, wenn ich c.save verwendet!. Hat jemand Ideen?

+0

Schuss im Dunkel, aber wie kam das ursprüngliche Gleichgewicht von 0 in dorthin gelangen, und wird beim Speichern genannt zu werden? – davidfurber

+0

Das ursprüngliche Guthaben von 0 wurde nur durch customer.create gemacht (: data => {"balance" => "0"}, etc ...) – james

Antwort

23

Ich brauchte noch das jetzt arbeiten und konnte nicht warten, bis der Fehler behoben werden, so ist hier mein Problem zu umgehen:

c.data["balance"] = "100" 
c.data_will_change! 
c.save 

... und es wird in der DB gespeichert!

Die "attribute_name_will_change!" Methode ist nicht so gut dokumentiert und kann in der Einführung in das aktive Modell Schmutzige Modul gefunden werden: http://api.rubyonrails.org/classes/ActiveModel/Dirty.html

+0

Ja, das funktionierte auch für mich. Vielen Dank. – james

+0

Das funktionierte für mich, aber ich musste die _will_change verwenden! Methode, bevor Sie den Wert ändern, um es zu fangen - was die Dokumentation sagt, sollten Sie tun. – John

+0

c. {Was immer Ihre Hstore-Spalte heißt} _will_change! – wbeange