1

我有具有用於存儲用戶的部份資料圖片一上傳carrierwave如何緩存包含carrierwave上傳到Redis的

class User < ActiveRecord::Base 
    mount_uploader :profilepic, LogoUploaderUploader 

我想緩存在此redis的用戶對象的用戶模型的ActiveRecord模型對象。雖然我緩存調用的activerecord對象上to_json方法其中profilepic字段轉換在用戶對象包含圖像

user={id:1, username: "sam", profilepic: {url:"path_to_image.jpg"}} 

這部分是正常,我可以將它存儲在redis的的URL的哈希。但麻煩的是當我檢索Redis的數據,並嘗試將其轉換爲一個ActiveRecord的對象像下面

user=User.new(json_data) 

的profilepic場來空。看起來它不能將profilepic hash反序列化爲合適的值。

無論如何,我可以在保存到redis後取回適合profilepic的值。

回答

0

而不是在Redis中存儲ActiveRecord::Base,您應該只存儲它的id並在需要時從數據庫重新加載對象。

原因很簡單:通過將0123ns的實例序列化爲JSON並使用Model.new(json_data)恢復它是不可能的。因爲to_json可能不會序列化所有屬性,並且Model.new可能無法恢復實例內部狀態。

在您的示例中,具體問題是User.new需要profilepic的文件對象。但to_json方法無法將文件對象呈現到JSON中,而是呈現包含URL的散列。

+0

我試圖通過在Redis中保存記錄來引入緩存層。從數據庫加載將無法達到目的。如果有一種方法可以將網址分配回載波上傳器字段,那就是我正在尋找的.... –

+0

您的數據庫是否比Redis慢?爲什麼?索引缺失? – spickermann

+0

這主要是爲了讓我能夠爲自己測試一下redis是如何「非常快」的,而不是mysql,特別是在用戶模型中的where子句中。 –