Ruby on rails Rails 3使用作用域进行多参数筛选
正在尝试使用url参数在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
一般来说,我更喜欢手工制作的解决方案,但对于这种问题,代码库很快就会变得一团糟。所以我想买一块宝石。我想你很接近了。这样的东西不会扩展到多个选项
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)