/ / Problém serializácie ActiveRecord - ruby-on-rails, ruby, serializácia, activerecord

Problém so serializáciou ActiveRecord - ruby-on-rail, rubín, serializácia, aktívny záznam

Mám stĺpec db, ktorý je serializovaný Hash:

class Foo < ActiveRecord::Base
serialize :bar
end

Keď vo vnútri baru uložím hash, je ich niekoľkohlbších úrovniach sa nezdá, že by sa hlbšie úrovne správne deserializovali, keď ich potrebujem. Objekty o jednu úroveň hlbšie budú deserializované. Avšak objekty hlboké 2 alebo viac úrovní zostávajú triedami YAML.

Pokúsil som sa ručne deserializovať pomocou YAML :: load (), ale vyskytla sa chyba, že argument nebol inštanciou IO.

Vie niekto, prečo sa kompletný Ruby objekt neerializuje?

UPRAVIŤ: Po ďalšom skúmaní sa zdá, že problém pramení zo skutočnosti, že volám virtuálny atribút zo serializovaného YAML.

class Foo < ActiveRecord::Base
serialize :bar
end

class Bar < ActiveRecord::Base
attr_accessor :enabled
end

@bars = @foo.bar[:bars]
@bars.each do |bar|
puts bar.enabled
end

výťažky:

NoMethodError: undefined method `enabled" for #<YAML::Object:0xb6f11844>
from (irb):12
from (irb):11:in `each"
from (irb):11
from :0

Znamená to, že deserializácia nie je „skutočná“, tj koná sa objekt YAML podobný k pôvodnému objektu, ale nejde o skutočnú inštanciu tohto objektu?

odpovede:

4 pre odpoveď č. 1

Pri serializácii používateľom definovaných objektov namiesto „obyčajných starých Ruby“ objektov treba mať na pamäti dve veci.

  • Musíte mať načítané triedy definované používateľom skôr, ako bude možné objekt správne de-serializovať, inak budú inštancie generického typu YAML :: Object. De-serializácia nenahráva triedy automaticky.
  • Niektoré objekty sa nemusia správne serializovať bez určitého prispôsobenia, aj keď to vo všeobecnosti neplatí.

Spravidla sa serializujú inštancie súboruObjekt ActiveRecord :: Base je zlý nápad, pretože majú mimoriadne množstvo batožiny, ktoré bude okrem vášho atribútu potrebné zakódovať. Najlepšie je zostaviť triedu, ktorá je odvodená priamo od Object, čo je predvolené správanie, alebo z jednoduchej základnej triedy nejakého druhu.


1 pre odpoveď č. 2

Toto je riešenie pre vnorenú YAML deserializáciu v prípade, že pomáha: Problém s serializáciou triedy Ruby on Rails od autora etienne.