Ruby on rails RubyonRails迭代参数
我有一个客户端正在发送诸如年龄、性别、姓名等参数。 我需要根据params从表中检索数据,但首先我需要检查param是否存在,以避免出现null param,从而导致空结果。这些参数起着过滤器的作用,因此它们可以被触发,也可以被保留。 我现在正在做的是Ruby on rails RubyonRails迭代参数,ruby-on-rails,ruby,params,Ruby On Rails,Ruby,Params,我有一个客户端正在发送诸如年龄、性别、姓名等参数。 我需要根据params从表中检索数据,但首先我需要检查param是否存在,以避免出现null param,从而导致空结果。这些参数起着过滤器的作用,因此它们可以被触发,也可以被保留。 我现在正在做的是 @retieve = Student.all unless params[:age].nil? @retrieve = @retrieve.where(age: params[:age]) end unless 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以干巴巴的语句而闻名,我很确定有人知道一种更好的方法来实现这一点,并使其具有灵活性。
感谢您提供的任何答案或建议 如果所有这些过滤器都包含在参数的子组中,您可以在不包含不需要的参数(例如rails添加的:action和:controller参数)的情况下对其进行迭代,那么这将是最有效的 一旦你做到了,你就可以做到
(params[:filters] || {}).inject(Student.all) do |scope, (key, value)|
scope.where(key => value)
end
有几种方法可以做到这一点,你可以选择在这个阶段要走多远 <>我要考虑的两件大事----/P> 1创建好的作用域,允许您发送一个参数,如果它为零则忽略它。这样,您就可以为表单中的每个参数附加另一个作用域,而不使用if或除非,它将被忽略 2将搜索转移到单独的a类问题中,以保持控制器干净 这里有一篇博客文章,讨论了一些在这个答案中无法发表的概念。网上有很多关于这方面的信息,我在网上搜索了rails search filter params concern,为您提供了一个示例
学生,哪里的params[:filters]就足够了?@Frederick Cheung-我试图理解你的代码是如何工作的,但我弄不清楚:你能解释一下吗?它看起来真的像是我要找的!感谢you@jack-如评论所述,它对Student没有多大影响。whereparams[:filters]假设它们在未设置时确实从params中丢失假设它们在未设置时确实从params中丢失谢谢!你链接的博客真的很好,谢谢分享!