2017-12-01 1 views
0

Ich habe ein Modell mit einer serialisierten Textspalte. Wenn ich den Datensatz speichere und neu lade, scheinen die Werte zu bestehen, aber wenn ich den Datensatz abfrage, sind die Werte weg.Rails 3 serialisierte Hashwerte speichern, aber nicht persistent

(Demonstration unter der Einfachheit halber gekürzt)

class Subscription < ActiveRecord::Base 
    serialize :pending_changes, Hash 
    attr_accessible :pending_changes 
    attr_accessor :pending_changes 
end 

class AddPendingChangesToSubscriptions < ActiveRecord::Migration 
    def change 
    add_column :subscriptions, :pending_changes, :text 
    end 
end 

s = Subscription.new 

s.pending_changes = {foo: "bar"} 

s.save 
# => true 

s.reload.pending_changes 
# => {foo: "bar"} 

Subscription.last.pending_changes 
# => nil 

Das gleiche passiert, wenn {"foo" => "bar"} als Wert zu speichern.

Ich habe auch bemerkt, dass, wenn save genannt wird, ist die resultierende SQL-Abfrage wird wie folgt:

UPDATE 'subscriptions' SET 'updated_at' = '2017-12-01 23:46:05', 'pending_changes' = '--- {}\n' WHERE 'subscriptions'.'id' = 2 

sich nach den Antworten auf ähnliche Fragen, ich vergewissert haben, die db Spalte Datentyp text und Ich habe versucht, mit serialize :column_name mit und ohne die beigefügten Hash.

Antwort

5

Entfernen Sie attr_accessible: pending_changes und attr_accessor: pending_changes aus dem Modell, da Sie eine Spalte in der Datenbank haben, also keine Notwendigkeit, attr_accessible, attr_accessor zu verwenden. Verwenden Sie den Modellcode wie folgt und versuchen Sie es.

class Subscription < ActiveRecord::Base 
    serialize :pending_changes, Hash 
end 
+0

Nun, das hat den Trick! Vielen Dank. Ich habe mir angewöhnt, 'attr_accessible' zu ​​setzen, da es für meine Massenaufgabe erforderlich ist (meiner Erfahrung nach). In diesem Fall kann ich darauf verzichten. Kennen Sie WARUM 'attr_accessible' und die serialisierten Datenkonflikte? –

Verwandte Themen