Ruby on rails Rails 3使用作用域进行多参数筛选

Ruby on rails Rails 3使用作用域进行多参数筛选,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,正在尝试使用url参数在rails 3中进行基本筛选。我想有一个可以过滤的参数的白名单,并返回所有匹配的项目。我已经设置了一些范围(还有更多的范围): 一般来说,我更喜欢手工制作的解决方案,但对于这种问题,代码库很快就会变得一团糟。所以我想买一块宝石。我想你很接近了。这样的东西不会扩展到多个选项 query = Job.scoped query = query.budget_min(params[:budget_min]) if params[:budget_min] query = query

正在尝试使用url参数在rails 3中进行基本筛选。我想有一个可以过滤的参数的白名单,并返回所有匹配的项目。我已经设置了一些范围(还有更多的范围):


一般来说,我更喜欢手工制作的解决方案,但对于这种问题,代码库很快就会变得一团糟。所以我想买一块宝石。

我想你很接近了。这样的东西不会扩展到多个选项

query = Job.scoped
query = query.budget_min(params[:budget_min]) if params[:budget_min]
query = query.budget_max(params[:budget_max]) if params[:budget_max]
@jobs = query.all

一种方法是将条件语句放入范围:

scope :budget_max, lambda { |max| where("budget < ?", max) unless max.nil? }
一种稍有不同的方法是在模型中使用如下内容(基于以下代码):


看起来很有趣,但必须有一个简单的方法,不需要在gemperfect上钉钉子-我错过了
的工作
query = Job.scoped
query = query.budget_min(params[:budget_min]) if params[:budget_min]
query = query.budget_max(params[:budget_max]) if params[:budget_max]
@jobs = query.all
scope :budget_max, lambda { |max| where("budget < ?", max) unless max.nil? }
Job.budget_min(params[:budget_min]).budget_max(params[:budget_max]) ...
class << self
  def search(q)
    whitelisted_params = {
      :budget_max => "budget > ?",
      :budget_min => "budget < ?"
    }

    whitelisted_params.keys.inject(scoped) do |combined_scope, param|
      if q[param].nil?
        combined_scope
      else
        combined_scope.where(whitelisted_params[param], q[param])
      end
    end
  end
end
MyModel.search(params)