2010-05-07 54 views
16

我正在使用will_paginate進行分頁,迄今一直運行良好,除了這一件事。will_paginate with named_scopes

如果我嘗試分頁一個範圍,比如

class User < ActiveRecord::Base 

    named_scope :scope, lambda { etc } 

end 

User.scope.paginate({:page => params[:page], :per_page => 10}) 

那會告訴我分頁是一個未定義的方法。我寧願不必爲此範圍使用第二種解決方案,我可以在這裏做些什麼?

回答

9

Lowgain,klew的版本應該開箱即用。在你的版本你應該寫:

User.scope.paginate :page => params[:page], :per_page => 10 

我更喜歡另一種分頁方法。它可以使控制器更乾淨,並在模型層封裝了分頁,對於如:

class Property < ActiveRecord::Base 
    named_scope :all_properties, lambda {{ :order => "name asc" }} 

    def self.admin_properties(page = 1) 
    self.all_properties.paginate(:page => page, :per_page => Settings.admin.per_page) 
    end 
end 

並在控制器非常清楚代碼:

class Admin::PropertiesController < Admin::AdminController 
    def index 
    @properties = Property.admin_properties(params[:page]) 
    end 
end 

PS:Settings.admin.per_page - 這是Searchlogic設置。

+0

嗯,這很有趣!這樣做是否有任何明顯的性能缺陷,因爲它正在對每個屬性進行分頁? – Lowgain 2010-05-09 19:50:29

+0

它如何分頁每個屬性? :)不是每一個,但所有。命名範圍* all_properties *是一種類方法(不是實例!)。所以當我們調用* self.all_properties *時,我們會從這個命名範圍接收所有屬性。然後我們對它們進行分頁。自我意味着類屬性本身 - 不是類屬性的對象。 – Voldy 2010-05-10 08:13:10

2

我有這樣定義的named_scope

named_scope :look_for, lambda { |search| bla;bla;bla } 

我把它叫做:

Person.look_for(params[:search]).paginate :page => params[:page] 

和它的作品。也許你需要一些參數給你的範圍?

+0

嗯,你會期待什麼樣的參數?範圍似乎在分頁之外工作 – Lowgain 2010-05-07 23:45:01

+0

如果您的範圍需要參數,那麼您應該給一個參數。如果不是,那麼不要;)。我的例子是帶參數。 – klew 2010-05-08 08:48:29

2

一個奇怪的解決方案的種類,但

User.scope.find(:all).paginate :page => params[:page], :per_page => 10 

的作品?

1

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)技巧來解決這個問題。

+0

剛剛意識到我2個月前曾在這篇博客上發過一篇博文,忘了它,然後今天「重新發現」了它。我討厭成爲老年人! – MikeJ 2010-07-04 06:29:24