只有在URL中存在param时,Rails才会使用:condition

时间:2012-07-30 09:13:58

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我试图从数据库中获取分页记录列表,条件是在url中给出。

例如:如果网址如下:?name=Michael&age=20 它应该显示20岁以上的所有Michaels等。

但如果网址与&age=20类似,则应显示所有年龄为20岁的人,并忽略"名称"参数。

我在1页上分页2个列表,两个都来自同一个型号,只是因位置而异,所以我的控制器中定义了2个分页:

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

如果现在只有param存在,那么现在如何从URL添加条件?

我是这样尝试的:

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

但是当我在URL中传递param时,它会给我错误:

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

接下来的问题是如何将条件与这个数组合并条件&#34; position = 1&#34;?

更新:我了解如何对条件进行分页,我只是不知道根据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

但我相信在rails中它可以更简单。

3 个答案:

答案 0 :(得分:4)

第一个选项:您可以手动粘贴基于传递参数的条件,构建自定义命名范围,如果传递的参数不为空,则添加一个位置(例如,来自一个旧项目):

# 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

第二个选项,只需使用ransack(或其前身,meta_search):https://github.com/ernie/ransack

答案 1 :(得分:0)

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

答案 2 :(得分:-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")

它就像一个魅力。