从查询参数过滤Rails控制器操作

时间:2013-10-30 01:15:46

标签: 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_scope gem,它运行得相当不错,但我的同事们表示担心范围声明类方法与类中的字段同名,例如:

scope :some_field, -> f { where some_field: f }

我的班级看起来像

class Foo
  ....
  attribute :some_field
  ....

我还考虑通过大型switch语句构建.where子句的“链”,但这看起来很难看。

TL;博士

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

我的最终解决方案

在阅读Andrew Wei给出的答案并花费更多时间解决问题之后,我决定在类本身上使用responds_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

1 个答案:

答案 0 :(得分:2)

这就是我通常做的事情。我不是说这是“Rails方式”。

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)

显然,您可以保护变量的分配方式。我只是想证明我使用的模式。