我一直在尝试使用Rails
find_by_sql
功能并传递Sub Query
作为参数。子查询将作为字符串而不是适当的query
附加到父查询中。下面是我的SQL。
sql = <<~SQL
SELECT
column_1,
column_2
FROM (
?
) AS sample_table
GROUP BY
column_1,
column_2
SQL
somemodel = SomeModel.find_by_sql [sql, someotherquery.to_sql]
someotherquery.to_sql
如下
SELECT * FROM someothertable WHERE column_1 in ('test') and column_2 in ('new test')
将其附加到父查询后,将在下面的SQL中将子查询作为字符串而不是正确的查询。
SELECT
column_1,
column_2
FROM (
'SELECT * FROM someothertable WHERE column_1 in (''test'') and column_2 in (''new test'')'
) AS sample_table
GROUP BY
column_1,
column_2
事实是,语法:
sql = "select * from model where column = ?"
data = Model.find_by_sql [sql, 'some value']
旨在防止SQL注入。您在此试图做的正是该语法试图防止的事情。这就是为什么它不起作用的原因。
在将其发送到find_by_sql
方法之前,必须在SQL中手动替换问号。
例如,在创建SQL字符串期间:
sql = <<~SQL
SELECT
column_1,
column_2
FROM (
#{someotherquery.to_sql}
) AS sample_table
GROUP BY
column_1,
column_2
SQL
或通过执行替换:
sql.sub!('?', someotherquery.to_sql)
最后,现在您可以将其发送到find_by_sql
以执行查询
somemodel = SomeModel.find_by_sql(sql)