ActiveRecord中的多个或条件

Raf*_*ida 14 activerecord ruby-on-rails

我有两张桌子:律师和电话.电话分为区号和号码.律师有很多电话.我想制作一个查询,搜索手机列表中有手机匹配手机的律师.

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

Lawyer.join(:phones).where(:area_code => area_code, :number => number)
Run Code Online (Sandbox Code Playgroud)

问题是我有一个包含多个区号的列表.所以我真的想做这样的事情:

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

但是,我不想提出很多疑问.不能在单个查询语句中完成吗?

编辑:这就是我单独使用SQL做类似的事情(假设数字列表是[{:area_code =>'555',:number =>'1234564'},{:area_code =>'533',:数> '12345678'}])

select * from phones where (area_code, number) in (('555', '1234564'), ('533', '12345678'))
Run Code Online (Sandbox Code Playgroud)

如果有人可以将其翻译成ActiveRecord,那就太好了.

mik*_*ked 16

如果传递一个area_codes数组,AR将构建一个IN条件.因此,您可以使用原始搜索并使用数组:

其中area_codes是area_codes的数组,并且数字是一个数字数组:

 Lawyer.join(:phones).where(:area_code => area_codes, :number => numbers)
Run Code Online (Sandbox Code Playgroud)

要么:

 Lawyer.join(:phones).where("phones.area_code IN (?) AND phones.number IN (?)", area_codes, numbers)
Run Code Online (Sandbox Code Playgroud)

应该产量:

 SELECT * from lawyers JOIN phones ON phones.lawyer_id = lawyers.id WHERE phones.area_code IN (...) AND phones.number IN (...)
Run Code Online (Sandbox Code Playgroud)

  • 在 SQL 中很容易做到这一点: select * from phone where (area_code, number) in (('555', '5555555'), ('444','12345678')) 所以真的没有理由去规范化数据。我需要做的就是如何将其转换为 ActiveRecord。 (2认同)

xjl*_*in0 5

Lawyer.join(:phones).where(
  "(phones.area_code, phones.number) IN ( ('555', '5555555'), ('444', '12345678') )"
)
Run Code Online (Sandbox Code Playgroud)