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
.
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? –