Hallo,
der Use Case: Ich möchte in Model A eine Kopie von Model B speichern.
Und zwar mit Hilfe von ActiveRecords serialize Methode.
class A < ActiveRecord::Base
serialize :b
end
class B < ActiveRecord::Base
end
Folgendes funktioniert
A.create(:b => {:a => 1})
Der Hash wird YAML-serialisiert in die Datenbank geschrieben. Aber
wenn die Referenz eine Instanz von ActiveRecord ist, dann passiert
nichts.
A.create(:b => B.find(:first)) # natürlich angenommen es gibt ein B in
der Datenbank
Trotzdem ist die b Spalte in der Datenbank dann leer. Beim abholen des
Datensatzes ist b nil.
Meine Analyse sagt mir, dass man anscheinend ActiveRecord-Instanzen
nicht mit Hilfe der serialize Methode serialisieren kann.
Hat jemand einen Tipp, was ich übersehen habe, oder wie ich am
elegantesten die Serialisierung manuell implementiere.
Vielen Dank
Gregor
Hi, ohne nachzudenken… was ist mit to_yaml?
A.create(:b => B.find(:first).to_yaml)
-alex
On Nov 19, 2007 11:52 AM, Alex P. [email protected]
wrote:
Hi, ohne nachzudenken… was ist mit to_yaml?
A.create(:b => B.find(:first).to_yaml)
Das wäre natürlich eine option, aber extrem unsympathisch, da ich dann
an allen stellen, wo ich b benutzen möchte, YAML::load und YAML::dump
benutzen müsste. Das ist nicht meine Vorstellung von Kapselung. Und
eigentlich ist das ja genau das was serialize automatisch tun sollte.
Hat jmd. noch andere Ideen?
Viele
Grüße
Gregor
Hallo,
ich habe das ganze jetzt wie folgt gelöst. Nicht ideal aber praktikabel.
class A < ActiveRecord::Base
def b
B # force loading of B in dev mode
@b ||= YAML::load(read_attribute(:stored_b))
end
def b=(b)
raise(SerializationTypeMismatch,
"stored_b was supposed to be a B, but was " +
“a #{customer.class.to_s}”
) unless b.is_a?(B)
write_attribute(:stored_b, YAML::dump(b))
@b = b
end
end
class B < ActiveRecord::Base; end
In der Datenbank gibt es dann keine “b”-Spalte mehr, sondern ein
“b_stored”. Somit habe ich Lazy-Initialisierung und kann die Getter
und Setter wie gewohnt benutzen.
Vielleicht hilft es jemandem weiter, wenn er mal danach sucht.
Viele
Grüße
Gregor