【问题标题】:Rails fetch serialized model recordRails 获取序列化模型记录
【发布时间】:2012-08-15 10:57:15
【问题描述】:

我正在建立一个 redis 存储,我的会话 user_id 值存储在 cookie 中,其余模型数据(名字、姓氏、用户名等)存储在 redis 中。我是 Redis 新手,不知道如何存储模型数据。

我有两个问题:

  1. 存储它的最佳方式是什么,我应该将它序列化为 XML、JSON 还是等效的 ruby​​ 对象。

  2. 获取存储的数据后,如何将其转换为工作模型对象?这样,当我执行 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`
    

    【讨论】:

      【解决方案2】:

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

      Existing Rails model without fetching it from the database

      【讨论】:

        猜你喜欢
        • 2023-03-20
        • 1970-01-01
        • 2011-05-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 2012-04-15
        • 1970-01-01
        • 2011-04-30
        相关资源
        最近更新 更多