我有一个客户端发送年龄,性别,姓名等参数。 我需要根据参数从表中检索数据,但首先我需要检查param的存在(以避免空参数,因此是空结果)。 params作为过滤器工作,因此可以触发它们或者它们可以保持空白。 我现在正在做的是
@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语句而闻名,我很确定那里有人知道更好的方法来实现这一点并使其变得灵活。 感谢您提供的任何答案或建议!
答案 0 :(得分:0)
如果所有这些过滤器都在params
的子网中,您可以迭代而不包含不需要的参数(例如rails添加的:action
和:controller
参数),这将最有效
一旦你完成了,你可以做到
(params[:filters] || {}).inject(Student.all) do |scope, (key, value)|
scope.where(key => value)
end
答案 1 :(得分:0)
有几种方法可以做这种事情,你可以选择在这个阶段你想走多远。
我要考虑的两件大事 -
1)制作好的范围,允许你发送一个参数并忽略它,如果它是零。这样,您可以为表单中的每个参数添加另一个作用域,并且在不使用if
或unless
2)将搜索移动到单独的类(关注点)以保持控制器清洁。
这是一篇博客文章,讨论了一些概念(在这个答案中发布的内容太多了)。网上有很多关于此的信息,我在网上搜索了“rails search filter params concern”以获得一个例子。