2011-04-27 39 views
2

執行IS IN查詢的最佳方法是什麼,尤其是在涉及連接時?ActiveRecord 3「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而不是'='運算符)

回答

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

你不需要拆分。 ActiveRecord足夠聰明,可以理解數組,所以你需要的只是Table1.joins(:table2).where({ :table2s => { :ident => params[:idents]}})

事實上,你不需要嵌套。 Table1.joins(:table2).where('table2s.ident' => params[:idents])應該找工作。 Arel非常聰明!

+2

'PARAMS [:idents]'看起來像一個字符串,所以他需要'split' – fl00r 2011-04-27 19:30:06

+0

是PARAMS將是一個字符串 – mikeycgto 2011-04-27 19:56:02

+0

至少在這種情況下 – mikeycgto 2011-04-27 20:06:00