Множество или условия в ActiveRecord

У меня есть две таблицы: Адвокат и Телефон. Телефон разделен на код города и номер. У адвоката много телефонов. Я хочу создать запрос, который ищет юристов, у которых есть телефон, соответствующий телефону, из списка телефонов.

Если бы у меня был только один телефон, я мог бы найти его так:

Lawyer.join(:phones).where(:area_code => area_code, :number => number)

Проблема в том, что у меня есть список с более чем одним региональным кодом. Поэтому я действительно хочу сделать что-то вроде этого:

lawyers = []
phones.each { |phone| lawyers += Lawyer.join(:phones).where(:area_code => phone[:area_code], :number => phone[:number]) }

Однако я не хочу делать много запросов. Не может ли это быть сделано в одном запросе запроса?

Изменить: так я бы сделал аналогичную вещь, используя только SQL (при условии, что список чисел был [{: area_code = > '555',: number = > '1234564'}, {: area_code = > '533 ',: number = > ' 12345678 '}])

select * from phones where (area_code, number) in (('555', '1234564'), ('533', '12345678'))

Если кто-то может получить это переведенное в ActiveRecord, это будет здорово.

Ответ 1

Если вы передадите массив area_codes, AR построит условие IN. Таким образом, вы можете использовать свой первоначальный поиск и использовать массивы вместо этого:

где area_codes - это массив идентификаторов области и кодирует массив чисел:

 Lawyer.join(:phones).where(:area_code => area_codes, :number => numbers)

или

 Lawyer.join(:phones).where("phones.area_code IN (?) AND phones.number IN (?)", area_codes, numbers)

Должен выдать:

 SELECT * from lawyers JOIN phones ON phones.lawyer_id = lawyers.id WHERE phones.area_code IN (...) AND phones.number IN (...)

Ответ 2

Lawyer.join(:phones).where(
  "(phones.area_code, phones.number) IN ( ('555', '5555555'), ('444', '12345678') )"
)