Посмотрите, как resque справляется с этим. По сути, они используют объекты JSON вместо XML или дампированный объект Ruby, и я бы рекомендовал использовать тот же подход, поскольку это означает меньшую нагрузку. Rails предлагает очень простую .to_json
функциональность для множества различных объектов, включая экземпляры ActiveRecord.
Если вы используете JSON для сериализации вашего объекта, он расширится до обычного хеша при десериализации. Нетрудно передать это, чтобы создать собственный класс, который мог бы наследовать атрибуты и использовать method_missing
, чтобы либо получить атрибут из объекта json, либо загрузить соответствующую запись базы данных. Примерно так должно работать:
class CachedObject
attr_accessor :attributes
def initialize(json)
self.attributes = ActiveSupport::JSON.decode(json)
end
def method_missing(method)
attributes[method.to_s] || Model.find_by_id(attributes['id']).send(method)
end
end
obj = CachedObject.new('{"id":"123","foo":"some value"}')
p obj.foo # => "some value"
p obj.bar # => Executes `Model.find_by_id(123).bar`