2011-07-07 89 views
1

我正在建立一個redis存儲區,其中會話user_id值存儲在cookie中,其餘模型數據(名字,姓氏,用戶名等)存儲在redis中。我對Redis非常陌生,我不確定如何存儲模型數據。Rails獲取序列化模型記錄

我有兩個問題:

  1. 什麼是存儲它的最佳方式,我應該序列化的XML,JSON或Ruby對象等效。

  2. 當獲取存儲的數據時,如何將其轉換爲工作模型對象?這樣,當我做user_fetched_from_redis.username時,它會像user_fetched_from_db.username一樣工作。如果有任何字段不是從redis存儲中獲取的,那麼我希望activerecord執行SELECT * FROM語句來填充對象中的所有屬性。這可能嗎?

回答

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`