在Ruby on Rails中的原始MySQL查询中传递数组

所以,我有一个问题.我有一个查询,它从一个表(例如table1)返回ID,我必须将这些ID传递给另一个使用table2的查询. (由于某些原因,不能选择内部选择或联接).查询:client = Mysql2::Client.new(:host = localhost, :...

所以,我有一个问题.我有一个查询,它从一个表(例如table1)返回ID,我必须将这些ID传递给另一个使用table2的查询. (由于某些原因,不能选择内部选择或联接).

查询:

client = Mysql2::Client.new(:host => "localhost", :username => "", :password => "", :database =>"test")
query1 = %Q{select id from table1 where code='ABC123'}
ids = client.query(query1)
query2 = %Q{select * from table2 where `table2`.`table1_id` IN (#{ids}) and status="rejected"}
table2_data = client.query(query2)

ids是Mysql2 :: Result类型
另外,当我执行ids.to_a时,结果数组具有类似以下数据:[{“ id” => 1},{“ id” => 2}]
我需要一些可行的方法来将ID传递给第二个查询.我尝试了ids.to_a,但是由于括号[]导致错误.我也尝试过串联,说MySQL结果是:

array = ids.to_a  # [1,2,3]
id_new = "("+#{array.join(',')}+")"

id_new变成字符串的“(1,2,3)”,因此IN不起作用.

任何人都可以建议一些如何在原始MySQL查询中传递ID数组的方法吗?
我已经不知所措了,但找不到合适的答案.

编辑:我只能将Active Record用于query1,如果是这种情况,并且id是Active Record对象,那么谁能建议如何在应该是原始SQL查询的IN子句中将其传递给query2?

Edit2:我不能使用Active Record(用于query2)或联接,因为它使查询变得繁重,并且花费很长时间(> 10s)来获取结果(存在索引).因此,我正在使用原始查询对其进行优化.

解决方法:

您确定它不起作用是因为它是一个字符串.我认为由于括号重复而无法使用.请尝试以下方法:

array = ids.flat_map(&:values).join(',')
query2 = %Q{select * from table2 where `table2`.`table1_id` IN (#{array}) and status="rejected"}

我建议使用ORM (object-relational mapping),例如ActiveRecord或Sequel gems-尤其是因为通过字符串填充手动构建数据库查询容易出错,并且会导致诸如sql注入之类的漏洞.

本文标题为:在Ruby on Rails中的原始MySQL查询中传递数组

基础教程推荐