Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从查询参数筛选Rails控制器操作_Ruby On Rails_Ruby On Rails 4_Has Scope - Fatal编程技术网

Ruby on rails 从查询参数筛选Rails控制器操作

Ruby on rails 从查询参数筛选Rails控制器操作,ruby-on-rails,ruby-on-rails-4,has-scope,Ruby On Rails,Ruby On Rails 4,Has Scope,我正在寻找一种最佳方法,根据任意数量的查询参数过滤我返回Rails视图的记录,例如: http://localhost:3000/foo?some_field=fubar&this_field_left_blank=&a_third_field=bar 我现在在做什么 我发现并使用了has_scopegem,它工作得相当不错,但我的同事们对scope声明的类方法与类上的字段同名表示担忧,例如: scope :some_field, -> f { where some_field: f }

我正在寻找一种最佳方法,根据任意数量的查询参数过滤我返回Rails视图的记录,例如:

http://localhost:3000/foo?some_field=fubar&this_field_left_blank=&a_third_field=bar

我现在在做什么 我发现并使用了
has_scope
gem,它工作得相当不错,但我的同事们对scope声明的类方法与类上的字段同名表示担忧,例如:

scope :some_field, -> f { where some_field: f }
我的班级看起来像

class Foo
  ....
  attribute :some_field
  ....
我还考虑过通过一个大的switch语句来构建一个
.where
子句的“链”,但这看起来很难看

tl;dr

是否有基于Rails中的查询参数过滤记录的模式和/或最佳实践

我的最终解决方案

在阅读了Andrew Wei给出的答案并花了更多的时间来解决这个问题后,我决定在类本身上使用一个参数循环
responses\u to
,如下所示:

params.each do |params,value|
  @mymodels = MyModel.send "by_#{filter}", value, @mymodels if MyModel.respond_to? "by_#{filter}" and not value.blank?
end
其中,每个MyModel类方法都类似于:

def self.by_some_field(value, relation)
  relation.where some_field: value
end

这是我通常做的事。我不是说这是“铁路之路”


显然,您将保护变量的分配方式。我只是想演示一下我使用的模式。

谢谢,但我想尝试避免建立这样的where子句。控制器代码将变得太大,我不喜欢。
where = {}

if params[:one]
    where["one"] = params[:one]
end

if params[:two] # .empty? , .nil?, x > 0... etc
    where["two"] = params[:two].to_i
end

@somethings = Something.where(where)