我试图从数据库中获取分页记录列表,条件是在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中它可以更简单。
答案 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")
它就像一个魅力。