2012-07-30 45 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