2012-07-30 30 views
2

我試圖實現來自數據庫的記錄的分頁列表,其中給出了在URL中給出的條件。Rails will_paginate使用:條件,只有當參數存在於URL

例如:如果URL是這樣的:?name=Michael&age=20 應該顯示所有與邁克爾斯20歲等

但如果URL中含有&age=20,它應該顯示所有的人有20歲,而忽略了「名」參數。

我分頁1頁2所列出,都來自同一個模型,只有位置而變化,所以我有我的控制器定義2個paginations:

@boss = Person.paginate(:page => params[:boss_page], :conditions => "position = 1") 
@manager = Person.paginate(:page => params[:manager_page], :conditons => "position = 2") 

如何現在添加從條件只有在參數存在的情況下URL?

我是想這樣說:

conditions = [] 
conditions << [ "age = ?", params[:age] ] if params[:age].present? 

,但是當我在URL傳遞PARAM它給我的錯誤:

undefined method `%' for ["age = ? ", "1"]:Array 

接下來的問題是如何從這個數組狀態合併條件「位置= 1「?

更新:我知道如何做分頁與條件,我只是沒有得到什麼是最好的想法來指定基於GET參數的條件。 我總是可以做這樣的:

if params[:age].present? 
@boss = version with age conditons 
else if params[:age].present? and params[:name].present? 
@boss = version with age and name 
else if params[:name].preset? 
@boss = version with name only 

但我相信,在軌道是可以做到的簡單。

+0

對於這個問題[1] [1] [此鏈接幫助你。]:http://stackoverflow.com/questions/10867977/how-to-use-pagination-in-rails- 3-2-3 – 2012-07-30 09:17:46

+0

我更新了問題 – 2012-07-30 09:40:12

回答

-3

最後我做到了在另一個更簡單的對我來說道:

@p = Person.scoped 
@p = @p.where(:age => params[:age]) if params[:age].present? 
@p = @p.where(:name => params[:name]) if params[:name].present? 

@boss = @p.paginate(:page => params[:boss_page], :conditions => "position = 1") 
@manager = @p.paginate(:page => params[:manager_page], :conditons => "position = 2") 

它的功能就像一個魅力。

+1

Tomasz的答案是在這裏做的正確的事情 - 並將導致更清潔的代碼 – lukaszkorecki 2013-07-25 09:16:48

0
@boss = Person.where(:position => 1).paginate(:page => params[:boss_page]) 
@manager = Post.where(:position => 2).paginate(:page => params[:manager_page]) 
+0

我知道如何做這個簡單的條件。我需要一種基於它們的存在來添加來自url的params的方法。 – 2012-07-30 09:40:36

4

第一種選擇:你可以手動膠基於傳遞參數將添加一個where條件,構建自定義命名範圍,如果傳遞的參數不爲空(從一箇舊的項目爲例):

# custom scope in model 
# call in controller by Model.email_contains(params[:email]) 
def self.email_contains(searched_email) 
    if(searched_email.blank?) 
    all # scoped 
    else 
    where(:email => searched_email) 
    end 
end 

第二個選項,只需使用搜查(或其前身meta_search):https://github.com/ernie/ransack