/ / Wiele lub warunki w ActiveRecord - ruby-on-rails, activerecord

Wiele lub warunki w ActiveRecord - ruby-on-rails, activerecord

Mam dwie tabele: prawnik i telefon. Telefon jest podzielony na numer kierunkowy i numer. Prawnik ma wiele telefonów. Chcę utworzyć zapytanie, które wyszukuje prawników, którzy mają telefon pasujący do telefonu z listy telefonów.

Gdybym miał tylko jeden telefon, mógłbym go wyszukać w ten sposób:

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

Problem polega na tym, że mam listę zawierającą więcej niż jeden numer kierunkowy. Tak naprawdę chcę zrobić coś takiego:

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

Jednak nie chcę tworzyć wielu zapytań. Czy nie można tego zrobić w pojedynczym zapytaniu?

Edycja: W ten sposób zrobiłbym to samo, używając samego SQL (zakładając, że lista liczb to [{: area_code => "555",: number => "1234564"}, {: area_code => "533",: number => "12345678"}])

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

Jeśli ktoś może uzyskać to, co przetłumaczono na ActiveRecord, to byłoby świetnie.

Odpowiedzi:

14 dla odpowiedzi № 1

Jeśli przekażesz tablicę kodów obszaru, AR zbuduje warunek IN. Możesz więc użyć oryginalnych tablic wyszukiwania i używania zamiast:

gdzie kod_strony jest tablicą kodów obszaru i numeruje tablicę liczb:

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

lub:

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

Powinien dać:

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

0 dla odpowiedzi nr 2
Lawyer.join(:phones).where(
"(phones.area_code, phones.number) IN ( ("555", "5555555"), ("444", "12345678") )"
)