【问题标题】:Rails fetch serialized model recordRails 获取序列化模型记录
【发布时间】:2012-08-15 10:57:15
【问题描述】:
我正在建立一个 redis 存储,我的会话 user_id 值存储在 cookie 中,其余模型数据(名字、姓氏、用户名等)存储在 redis 中。我是 Redis 新手,不知道如何存储模型数据。
我有两个问题:
存储它的最佳方式是什么,我应该将它序列化为 XML、JSON 还是等效的 ruby 对象。
获取存储的数据后,如何将其转换为工作模型对象?这样,当我执行 user_fetched_from_redis.username 时,它就会像 user_fetched_from_db.username 一样工作。如果有任何字段没有从 redis 存储中获取,那么我希望 activerecord 执行 SELECT * FROM 语句来填充对象中的所有属性。这可能吗?
【问题讨论】:
标签:
ruby-on-rails
ruby
activerecord
orm
redis
【解决方案1】:
看看resque 是如何处理这个问题的。基本上,他们使用 JSON 对象而不是 XML 或转储的 Ruby 对象,我主张使用相同的方法,因为这意味着更少的开销。 Rails 为许多不同的对象(包括 ActiveRecord 实例)提供了非常简单的 .to_json 功能。
如果你使用 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`