2

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

例如:如果 url 是这样的:?name=Michael&age=20 它应该显示所有 20 岁的 Michaels 等。

但是如果 url 是 like &age=20,它应该显示所有 20 岁的人并忽略“name”参数。

我在 1 页上对 2 个列表进行分页,它们都来自同一型号,仅因位置而异,所以我在控制器中定义了 2 个分页:

@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 中传递参数时它给了我错误:

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

下一个问题是如何将此数组中的条件与条件“position = 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

但我相信在 Rails 中它可以做得更简单。

4

3 回答 3

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

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

于 2012-07-31T12:58:14.687 回答
0
@boss = Person.where(:position => 1).paginate(:page => params[:boss_page])
@manager = Post.where(:position => 2).paginate(:page => params[:manager_page])
于 2012-07-30T09:35:35.497 回答
-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")

它就像一个魅力。

于 2012-07-31T15:44:08.843 回答