20

我有两张桌子:Lawyer 和 Phone。电话分为区号和号码。一位律师有很多电话。我想生成一个查询,从电话列表中搜索电话与电话匹配的律师。

如果我只有一部手机,我可以这样搜索:

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 回答
4
Lawyer.join(:phones).where(
  "(phones.area_code, phones.number) IN ( ('555', '5555555'), ('444', '12345678') )"
)
于 2017-07-21T21:31:41.287 回答