2012-03-22 107 views
1

所以,爲了表現,我使用數據庫會話。我認爲,雖然會話是服務器端,但我也可以在會話中存儲常用的對象。所以,我存儲了current_user,current_account和current_user權限的序列化版本。這是一個好的設計決定嗎?有沒有更好的辦法?

用戶模型掌握了很多權限方法(比如user.can_do_whatever),但是因爲我試圖提高效率,並且在會話中存儲了常見的東西(這可以減少數據庫訪問) ,是否有意義/違反任何設計標準(在每次請求時)將會話存儲在current_user中的實例變量中?

截至目前,我想不出任何替代品。

+0

我聽說你不應該這樣做(在會話中存儲對象),但我不記得理由是什麼(除了明顯的「事情不同步」問題,這應該很容易足以應對,如果你小心)。我會看看我是否可以再次找到該引用... – 2012-03-22 19:06:23

+0

好吧,從current_user訪問的東西如果它們不同步並不重要,導致我從當前用戶使用的唯一屬性是id ,角色和權限組。所以,如果這些事情發生了變化,要求他們重新登錄是不是很好? = \ – NullVoxPopuli 2012-03-22 19:17:08

+0

也許,我可以在我的users_controller的更新方法中檢查一些需要重新登錄的字段,然後只更新會話數據 – NullVoxPopuli 2012-03-22 19:30:09

回答

3

ROR應用程序默認具有RESTful設計。 REST的一個規則是無狀態的。這意味着客戶端到服務器的每個請求都必須包含理解請求所需的所有信息,並且不能利用服務器上存儲的任何上下文。

如果您在數據庫性能方面遇到問題,請使用像memcached這樣的緩存系統,它已被集成到rails (Caching with Rails)中。

1

我發現了一個couplereferences警告,不要在會話中存儲非原始數據類型,但它們都只是警告,並且歸結爲:存儲複雜對象是「Expecially discouraged」[原文如此],但如果您決定你需要......好,只是要小心。

無論如何,我有點認爲用戶表的雙重作爲會話表的想法,但序列化仍然似乎有點粗略。如果您只是想減少數據庫請求的數量,那麼存儲ID和在查找用戶時使用:joins(可能需要一些hackery才能使其進入默認會話加載)。這避免了同步問題和序列化概略性,並且仍然只生成一個數據庫查詢。只要確保使用:joins而不是:include,因爲後者會生成a query for each table

希望有幫助!

+0

,這些會話不存儲在users表中。有一個會議桌。雖然我會確定閱讀這些參考文獻。 – NullVoxPopuli 2012-03-22 19:53:42

+0

@TheLindyHop - 好的 - 很好。因爲那時我想到了一些,並開始看到這種想法出現各種各樣的複雜情況......我正要發佈一個「但等待!」實際上編輯。乾杯! – 2012-03-22 19:55:39

相關問題