Ruby on rails 从查询参数筛选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 }
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)