Есть ли способ заставить ActiveRecord написать «ГДЕ (a, b) в ((1,2), (3,4))» с использованием искателей AR - PullRequest
3 голосов
/ 06 февраля 2010

Есть ли способ заставить ActiveRecord записывать 'WHERE (a, b) в ((1,2), (3,4))', используя AR-искатели.

Я бы подумал

Widget.find(:all, :conditions => ['(a,b) in (?)', [[1,2][3,4]]])

но внутренние массивы конвертируются в YAML?!?! Прямо сейчас я использую find_by_sql. Есть ли лучший способ написать это?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2010

Вы можете сделать это:

Widget.all(:conditions => ["(a,b) in ((?),(?))", [1,2], [3,4]])

Хотя это не идеально, если у вас переменное количество значений. Похоже, хорошая возможность для патча ActiveRecord!

Обновление: кладжа для переменного числа значений. Все же лучше, чем делать find_by_sql ... но вы правы, он должен изначально поддерживаться AR.

values = [[1,2],[3,4]]
Widget.all(:conditions => ["(a,b) in (#{Array.new(values.length,'(?)').join(',')})", *values])
0 голосов
/ 06 февраля 2010

В зависимости от того, насколько динамичным вам это нужно, вы всегда можете сделать это в виде строки, например:

Widget.all(:conditions => ["(a,b) in ((1,2), (3,4))"])

Это по крайней мере спасает вас от звонка find_by_sql. Не могли бы вы также использовать оператор ИЛИ для разделения двух массивов?

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