Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails迭代参数_Ruby On Rails_Ruby_Params - Fatal编程技术网

Ruby on rails RubyonRails迭代参数

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[:

我有一个客户端正在发送诸如年龄、性别、姓名等参数。 我需要根据params从表中检索数据,但首先我需要检查param是否存在,以避免出现null param,从而导致空结果。这些参数起着过滤器的作用,因此它们可以被触发,也可以被保留。 我现在正在做的是

@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中丢失谢谢!你链接的博客真的很好,谢谢分享!