Lowgain,它聽起來不像你,但只是爲了確保 - 你實際上沒有做一個名爲範圍的named_scope測試對不對?因爲作用域是一種現有的方法,因此您的作用域名稱會導致錯誤(和無限循環)。
編輯:
您的named_scope恰好包含一個:limit子句嗎?我剛開始有類似的問題。我有一個模型響應其belongs_to的用戶,有一個名爲範圍是這樣的:
named_scope :top, lambda { |limit| {
:limit => limit,
:order => 'total_score DESC' }}
而且我看到在控制檯結果像這樣:
?> u = User.find 1
?> u.responses.length
=> 9
?> u.responses.paginate(:page => 1, :per_page => 5).length
=> 5
?> u.responses.top(3).length
=> 3
?> u.responses.top(3).paginate(:page => 1, :per_page => 5).length
=> 5
哎呀!我的前三分頁如何生成超過三行?根據您的例子,我想你的發現(:所有)具有相似的結果招:
?> u.responses.top(3).find(:all).paginate(:page => 1, :per_page => 5).length
=> 3
這看起來像在named_scope的錯誤,因爲我可以will_paginate拍出來的照片,並得到類似的混亂髮生:
?> u.responses.top(3).length
=> 3
?> u.responses.top(3).size
=> 9 <-- .size produces wrong answer
?> r = u.responses.top(3)
?> r.size
=> 3 <-- correct when result assigned to var
到目前爲止,這隻在我使用MySQL時纔會發生。我想我在StackOverflow上讀到另一篇文章,其中有人使用帶有AR結果和MySQL的.size來解決類似問題,並且解決方案總是在AR結果上使用.length。我已經嘗試修改will_paginate來替換.size的所有實例,但是可惜它並不那麼簡單,但我懷疑這個或者類似的問題會影響到will_paginate。
目前,我正在使用你的find(:all)技巧來解決這個問題。
嗯,這很有趣!這樣做是否有任何明顯的性能缺陷,因爲它正在對每個屬性進行分頁? – Lowgain 2010-05-09 19:50:29
它如何分頁每個屬性? :)不是每一個,但所有。命名範圍* all_properties *是一種類方法(不是實例!)。所以當我們調用* self.all_properties *時,我們會從這個命名範圍接收所有屬性。然後我們對它們進行分頁。自我意味着類屬性本身 - 不是類屬性的對象。 – Voldy 2010-05-10 08:13:10