Das Serialisieren von Sitzungs-/Transaktionsobjekten zur Speicherung in der Datenbank mittels YAML ist in Rails eigentlich super-einfach:
class ConsolvixTransaction < ActiveRecord::Base
serialize :data, Hash
# ...
def [](key)
self.data[key]
end
def []=(key, value)
self.data[key] = value
end
end
Obiger Code veranlasst Rails, die data
-Spalte vor dem Speichern zu serialisieren und nach dem laden wieder zu deserialisieren. Dann kann ich während eine Transaktion aktiv ist einfach über
@transaction[:address] = Address.new(params[:address])
z.B. ein neues Adressenobjekt in der Transaktion ablegen und theoretisch später wieder darauf zugreifen. Aber weit gefehlt, denn Rails deserialisiert das Objekt nachher nicht als Address
-Objekt, sondern als YAMLObject
.
Eine kurze Internetrecherche ergab, dass das tatsächlich ein Bug in Rails ist: http://dev.rubyonrails.org/ticket/7537 bzw. http://dev.rubyonrails.org/ticket/8933
Die bei Ticket Nr. 7537 vorgeschlagene Lösung, den folgenden Code in die environment.rb einzufügen, funktioniert zwar so weit, aber dass ich nun für jede theoretisch mögliche Entität, die einmal in einer Transaktion vorkommen könnte, ein require
hinzufügen muss, ist mehr als nur hässlich.
require 'address'
require 'client'
require 'domain'
require 'email_address'
require 'system_user'
require 'user'
require 'email_account'
require 'ftp_account'
require 'hosting_account'
YAML.add_domain_type("ActiveRecord,2007", "") do |type, val|
klass = type.split(':').last.constantize
YAML.object_maker(klass, val)
end
class ActiveRecord::Base
def to_yaml_type
"!ActiveRecord,2007/#{self.class}"
end
end
Kennt jemand anderes von euch dieses Problem auch? Existiert das noch in Rails 2.0 oder einer späteren Version als 1.2.6?
Comments (1)
%w(address client ..).each { |e| require e } macht's vielleicht ein minimales Bisschen hübscher?
Posted by Stefan Tilkov | December 10, 2007 9:30 AM
Posted on December 10, 2007 09:30