ActiveRecord 3 "IS IN", где запросы - PullRequest
2 голосов
/ 27 апреля 2011

Каков наилучший способ выполнения запросов 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 ]

4 голосов
/ 27 апреля 2011

Позволить компилятору запросов сделать это за вас, как правило, это лучший способ сделать это, поскольку он будет обрабатывать случаи, которые вы можете забыть, например, передать значение 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 голос
/ 27 апреля 2011

Вам не нужен сплит. ActiveRecord достаточно умен, чтобы понимать массивы, поэтому все, что вам нужно, это Table1.joins(:table2).where( { :table2s => { :ident => params[:idents]}}).

На самом деле, вам не нужно вложение. Table1.joins(:table2).where('table2s.ident' => params[:idents]) должно работать найти. Арел довольно умен!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...