ruby-on-rails Rails:ActiveRecord中的多个或条件

f5emj3cl  于 2023-06-25  发布在  Ruby
关注(0)|答案(3)|浏览(169)

我有两张table:律师和电话电话分为区号和号码。律师有很多电话。我想生成一个查询,用于搜索电话与电话列表中的电话匹配的律师。
如果我只有一部手机,我可以这样搜索:

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

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

如果有人能把它翻译成ActiveRecord,那就太好了。

hlswsv35

hlswsv351#

如果传递一个area_code数组,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 (...)
7vux5j2d

7vux5j2d2#

Lawyer.join(:phones).where(
  "(phones.area_code, phones.number) IN ( ('555', '5555555'), ('444', '12345678') )"
)
ix0qys7i

ix0qys7i3#

我希望ActiveRecord能为我们支持这种语法,但是已经讨论过here了,似乎还没有采取任何行动。要解决此问题,您可以使用以下命令:

phone_numbers = [['555', '55555555'], ['444', '44444444'], ...]
placeholders = Array.new(phone_numbers.size, '(?)').join(', ')
Phone.where("(area_code, number) IN (#{placeholders}", *phone_numbers)

相关问题