SQL 子查询被附加为字符串而不是正确的查询

SQL Sub Query is being appended as a string instead of a proper query

我一直在尝试使用 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 注入。你在这里试图做的正是这种语法试图阻止的事情。这就是它不起作用的原因。

在将 SQL 发送到 find_by_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)