Rails获取序列化模型记录

时间:2011-07-07 22:25:33

标签: ruby-on-rails ruby activerecord orm redis

我正在设置一个redis商店,其中我的会话user_id值存储在cookie中,其余的模型数据(first_name,last_name,username等)存储在redis中。我是Redis的新手,我不知道如何存储模型数据。

我有两个问题:

  1. 存储它的最佳方法是什么,我应该使用XML,JSON还是等效的ruby对象进行序列化。

  2. 获取存储的数据时,如何将其转换为工作模型对象?这样,当我执行user_fetched_from_redis.username时,它将像user_fetched_from_db.username一样工作。如果有任何字段没有从redis存储中获取,那么我希望activerecord执行SELECT * FROM语句来填充对象中的所有属性。这可能吗?

2 个答案:

答案 0 :(得分:1)

看看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`

答案 1 :(得分:1)

这个问题的解决方案可以在另一篇文章中找到。

Existing Rails model without fetching it from the database