通常,rails會從數據庫中加載:select =>「*」。我知道我可以改變這一點。但我想換一種方式:總是隻選擇「id」,稍後在需要時自動加載屬性。軌道模型屬性的延遲加載
例如: 訪問user.description應該是否已加載。如果沒有,觸發「SELECT說明從用戶WHERE ID =#{self.id}」並設置它。
任何人都知道是否有一個軌道插件這樣做?或者如何實現它?
感謝, 科林
通常,rails會從數據庫中加載:select =>「*」。我知道我可以改變這一點。但我想換一種方式:總是隻選擇「id」,稍後在需要時自動加載屬性。軌道模型屬性的延遲加載
例如: 訪問user.description應該是否已加載。如果沒有,觸發「SELECT說明從用戶WHERE ID =#{self.id}」並設置它。
任何人都知道是否有一個軌道插件這樣做?或者如何實現它?
感謝, 科林
快速谷歌搜索止跌回升this,但我有glongman。我無法想象會出現什麼樣的性能問題......
將主要「巨大blob」字段重構爲單獨模型(如BookBody)是明智的,當使用模型時通常不需要這些模型散裝。另外,您也可以使用發現者
BookWithHugeBlobOfText.find(:first, :select=>"only,small,columns")
記錄選擇這種方式,因爲Rails的理念說(這是理所當然的!),將是隻讀的:select
選項,你需要有對模型中的所有的數據來證實它。延遲加載將是一件好事,但現在,我會阻止你使用monkeypatch插件。
另一種選擇是創建一個只包含輕量級字段並從那裏運行你的操作的SQL視圖。
我沒有任何大的BLOB表,但是一個非常繁忙的網站,高度動態緩存,所以即使是片段緩存也無法完成。所以我想,當我只從主數據庫加載主鍵以及使用鍵/值存儲(memcache,..)加載其他所有內容時,我可以擴展得更好,同時仍然擁有db中的所有數據,因此能夠保持正確使用外鍵的完整性等 – gucki 2010-12-11 01:07:07
我寫了一個Rails插件,完全是這樣做的lazy_columns。注意,更好的方法是創建一個新的模型,並且需要按需加載大列(因爲Rails默認情況下會延遲加載相關對象)。
我不會這麼做。如果你有一個有很多列的表/模型,那麼你需要重新檢查你的應用程序設計。 – ffoeg 2010-01-24 22:20:25
同樣,如果你有足夠多的列來解決這個問題,那麼你肯定會遇到一個問題,在每個模型中爲每個屬性生成一個SQL查詢? – Gareth 2010-01-24 22:56:06
最大的優點是可以通過像memcache或couchdb這樣快得多的鍵/值存儲來獲取單個屬性。我想知道facebook等大型網站如何管理他們的緩存,同時仍然保持數據的完整性(foreign_keys似乎不可能與這樣龐大的dabasets?) – gucki 2010-12-11 01:03:47