我有两张桌子:律师和电话。电话分为区号和号码。律师有很多电话。我想制作一个查询,搜索手机列表中有手机匹配手机的律师。
如果我只有一部手机,我可以这样搜索:
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 =&gt ;'533',:number =>'12345678'}])
select * from phones where (area_code, number) in (('555', '1234564'), ('533', '12345678'))
如果有人可以将其翻译成ActiveRecord,那就太好了。
答案 0 :(得分:16)
如果传递area_codes数组,AR将构建IN条件。因此,您可以使用原始搜索并使用数组:
其中area_codes是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 (...)
答案 1 :(得分:0)
Lawyer.join(:phones).where(
"(phones.area_code, phones.number) IN ( ('555', '5555555'), ('444', '12345678') )"
)