基于参数的动态ActiveRecord查找器方法链接

时间:2012-08-05 21:22:39

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

我是rails的新手,我想基于不同的GET参数(过滤和排序)进行选择查询。我可以在代码中添加条件吗?

例如:

if params[:ratings] 
  Movie.where(:rating => params[:ratings].keys)
end

然后添加排序和其他条件。我怎么能得到这个?也许有一种更好的方式来动态修改选择查询(不使用SQL字符串)。 感谢。

2 个答案:

答案 0 :(得分:4)

whereorder,...方法返回ActiveRecord :: Relation对象,以便您可以继续调用更多查询方法:

query = Movie
if(params[:ratings])
  query = query.where(:rating => params[:ratings].keys)
end
if(params[:some_order_param])
  query = query.order(params[:some_order_param])
end
# Keep adding more 'where', 'order', 'group', ... methods as needed ...
results = query.all

答案 1 :(得分:3)

我实际上会为这种行为推荐has_scope gem。它允许您在模型上定义范围和类方法,并自动将它们用于控制器中的过滤,排序等。

以下是文档中的一个小例子,但您可以使用它做很多事情:

class Graduation < ActiveRecord::Base
  scope :featured, where(:featured => true)
end

class GraduationsController < ApplicationController
  has_scope :featured, :type => :boolean
end