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
On Nov 19, 2007 11:59 AM, Gregor Schmidt <[EMAIL PROTECTED]> wrote:
> On Nov 19, 2007 11:52 AM, Alex Peuchert <[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
>
>
> >
> > -alex
> >
> >
> > Gregor Schmidt wrote:
> > > 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
> > > _______________________________________________
> > > rubyonrails-ug mailing list
> > > [email protected]
> > > http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug
> > >
> > >
> >
> > _______________________________________________
> > rubyonrails-ug mailing list
> > [email protected]
> > http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug
> >
>
_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug