ActiveRecord 3“IS IN”在哪里查询

时间:2011-04-27 19:13:46

标签: sql ruby-on-rails ruby activerecord sinatra

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而不是'='运算符)

2 个答案:

答案 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非常聪明!