我正在寻找最好的方法来过滤我在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
答案 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)
显然,您可以保护变量的分配方式。我只是想证明我使用的模式。