ruby 关于 rails 迭代参数

ruby on rails iterating params

我有一个客户端正在发送年龄、性别、姓名等参数。 我需要根据参数从 table 检索数据,但首先我需要检查参数是否存在(以避免空参数,从而避免空结果)。参数用作过滤器,因此可以触发它们或将它们留空。 我现在正在做的是

@retieve = Student.all
  unless params[:age].nil?
    @retrieve = @retrieve.where(age: params[:age])
end
   unless params[:gender].nil?
    @retrieve = @retrieve.where(gender: params[:gender])
end

等等,我收到的每个参数。通过这种方式,我检查过滤器是否已被选中,如果已选中,我将选择用作查询的参数 它有效,但由于 Ruby 以 DRY 语句而闻名,我很确定有人知道更好的方法来放置它并使其灵活。 感谢您提供的任何答案或建议!

如果所有这些过滤器都在 params 的子哈希中,您可以在不包含不需要的参数的情况下进行迭代(例如 :action:controller 参数 rails 添加)

一旦你完成了你可以做的事情

(params[:filters] || {}).inject(Student.all) do |scope, (key, value)|
  scope.where(key => value)
end

有几种方法可以做这种事情,您可以选择在这个阶段要走多远。

我会考虑两件大事 -

1) 制作漂亮的范围,允许您发送参数并在它为 nil 时忽略它。这样你就可以为表单中的每个参数附加另一个范围,而不使用 ifunless

它将被忽略

2) 将搜索移至单独的 class(一个问题)以保持您的控制器清洁。

这里有一个博客 post 讨论了一些概念(在这个答案中 post 太多了)。网上有很多关于这方面的信息,我在网上搜索 "rails search filter params concern" 给你举个例子。

http://www.justinweiss.com/blog/2014/02/17/search-and-filter-rails-models-without-bloating-your-controller/