20

Lawyer と Phone の 2 つのテーブルがあります。電話は市外局番と番号に分かれています。弁護士はたくさんの電話を持っています。電話のリストから電話と一致する電話を持っている弁護士を検索するクエリを作成したいと考えています。

電話が 1 台しかない場合は、次のように検索できます。

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', :番号=>'12345678'}])

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

誰かがそれを ActiveRecord に翻訳できるなら、それは素晴らしいことです。

4

2 に答える 2

17

area_codes の配列を渡すと、AR は IN 条件を作成します。したがって、元の検索を使用して、代わりに配列を使用できます。

ここで、area_codes は area_codes の配列で、numbers は数値の配列です。

 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 (...)
于 2012-04-23T23:43:34.363 に答える