2010-01-24 62 views
1

通常,rails會從數據庫中加載:select =>「*」。我知道我可以改變這一點。但我想換一種方式:總是隻選擇「id」,稍後在需要時自動加載屬性。軌道模型屬性的延遲加載

例如: 訪問user.description應該是否已加載。如果沒有,觸發「SELECT說明從用戶WHERE ID =#{self.id}」並設置它。

任何人都知道是否有一個軌道插件這樣做?或者如何實現它?

感謝, 科林

+2

我不會這麼做。如果你有一個有很多列的表/模型,那麼你需要重新檢查你的應用程序設計。 – ffoeg 2010-01-24 22:20:25

+0

同樣,如果你有足夠多的列來解決這個問題,那麼你肯定會遇到一個問題,在每個模型中爲每個屬性生成一個SQL查詢? – Gareth 2010-01-24 22:56:06

+0

最大的優點是可以通過像memcache或couchdb這樣快得多的鍵/值存儲來獲取單個屬性。我想知道facebook等大型網站如何管理他們的緩存,同時仍然保持數據的完整性(foreign_keys似乎不可能與這樣龐大的dabasets?) – gucki 2010-12-11 01:03:47

回答

0

快速谷歌搜索止跌回升this,但我有glongman。我無法想象會出現什麼樣的性能問題......

0

將主要「巨大blob」字段重構爲單獨模型(如BookBody)是明智的,當使用模型時通常不需要這些模型散裝。另外,您也可以使用發現者

BookWithHugeBlobOfText.find(:first, :select=>"only,small,columns") 

記錄選擇這種方式,因爲Rails的理念說(這是理所當然的!),將是隻讀的:select選項,你需要有對模型中的所有的數據來證實它。延遲加載將是一件好事,但現在,我會阻止你使用monkeypatch插件。

另一種選擇是創建一個只包含輕量級字段並從那裏運行你的操作的SQL視圖。

+0

我沒有任何大的BLOB表,但是一個非常繁忙的網站,高度動態緩存,所以即使是片段緩存也無法完成。所以我想,當我只從主數據庫加載主鍵以及使用鍵/值存儲(memcache,..)加載其他所有內容時,我可以擴展得更好,同時仍然擁有db中的所有數據,因此能夠保持正確使用外鍵的完整性等 – gucki 2010-12-11 01:07:07

1

我寫了一個Rails插件,完全是這樣做的lazy_columns。注意,更好的方法是創建一個新的模型,並且需要按需加載大列(因爲Rails默認情況下會延遲加載相關對象)。