代码之家  ›  专栏  ›  技术社区  ›  Coderama

在RubyonRails中构建SQL

  •  1
  • Coderama  · 技术社区  · 15 年前

    我尝试运行的以下SQL正在返回“的SQL_字符串” 从ID所在的人中选择ID(“16”)。 “:

    @ids = ["1", "6"]
    
    sql_string = <<-SQL
      SELECT id
      FROM people
      WHERE id IN ("#{@ids}")
    SQL
    

    有人能帮忙修改上面的查询吗?这样它就可以创建 从ID所在的人中选择ID(1,6)

    2 回复  |  直到 15 年前
        1
  •  2
  •   aNoble    15 年前

    只是投掷 @ids 在查询中,将连接数组并 "16" . 你会想跑的 @ids.join(',') 用逗号分隔它们。此外,还需要将字符串的表达式部分包装在 #{} . 否则它将把它视为文字。

    @ids = ["1", "6"]
    
    sql_string = <<-SQL
      SELECT id
      FROM people
      WHERE id IN (#{@ids.join(',')})
    SQL
    

    另外,在Rails中手动编写完整的SQL查询的有效原因非常少。你应该研究使用ActiveRecord来做一些类似的事情 People.find_all_by_id(@ids) 相反。

        2
  •  0
  •   Andrew Hodgkinson    15 年前

    对于上面其中一个答案中的代码片段,“@ids”没有被消毒。如果您的代码“知道”@ids“只包含有效的整数id,这很好,但是如果有任何id来自用户输入或URL,则非常危险。见:

    …寻找可能的解决方案。这是一个受保护的方法,因此我们必须通过“send”进行调用,以在控制台上演示其用法:

    >> ActiveRecord::Base.send(:sanitize_sql_for_conditions, { :id => [1,6] }, :people)
    => "people.\"id\" IN (1,6)"
    

    …也就是说,在sql where关键字后面插入上面的结果。正如前面的答案所说,除非您有一个不能使用标准Rails调用构建的非常复杂的案例(这对于coderama来说确实是如此,但对于未来的读者可能不是这样),否则您应该始终尝试避免手工编写SQL。

    考虑到这一点,构建复杂查询的另一种方法是“ez-where”插件,如果有人在阅读中考虑使用SQL,那么该插件值得一看: