IS IN查询的最佳方法是什么,尤其是在涉及连接时?
目前,我有以下内容:
Table1.joins(:table2).where( { :table2s => { :ident => params[:idents].split(',') } } )
这样可以完成工作。生成的WHERE子句类似于
WHERE "table2s"."ident" IS IN ('a','b','c')
我觉得这样会更干净:
Table1.joins(:table2).where("table2s.ident IS IN ?", params[:idents]:split(','))
有没有办法避免第一种风格并使用更像第二种风格的东西? (即,where方法识别数组并使用IS IN而不是'='运算符)
答案 0 :(得分:4)
让查询编译器为您执行此操作通常是一种更好的方法,因为它将处理您可能会忘记的情况,例如传递nil
值并最终导致错误的IS IN(NULL)
IS NULL
。但是,你可以清理你的陈述:
Table1.joins(:table2).where(:table2s => { :ident => params[:idents].split(',') })
更进一步,您可以将其缩小为:
Table1.joins(:table2).where('table2s.ident' => params[:idents].split(','))
你可以通过编写一个封装它的作用域来进一步清理它,而不是按原样使用它。
答案 1 :(得分:1)
您不需要拆分。 ActiveRecord非常聪明,可以理解数组,因此您只需要Table1.joins(:table2).where( { :table2s => { :ident => params[:idents]}})
。
实际上,您不需要嵌套。 Table1.joins(:table2).where('table2s.ident' => params[:idents])
应该找到。 Arel非常聪明!