在rails上构建ruby中的sql

时间:2010-08-22 07:30:20

标签: sql ruby-on-rails

我正在尝试运行的以下SQL是返回sql_string“ SELECT id FROM people WHERE id IN(”16“)”:

@ids = ["1", "6"]

sql_string = <<-SQL
  SELECT id
  FROM people
  WHERE id IN ("#{@ids}")
SQL

有人可以帮助修改上面的查询,这样它就会创建sql_string“ SELECT id FROM people WHERE id IN(1,6)

2 个答案:

答案 0 :(得分:2)

在查询中抛出@ids将连接数组并为您提供"16"。您需要运行@ids.join(',')以逗号分隔它们。另外,您需要在#{}中包装字符串的表达式部分。否则它会将其视为字面意思。

@ids = ["1", "6"]

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

P.S。在Rails中手动编写整个SQL查询的有效原因很少。您应该考虑使用ActiveRecord来代替People.find_all_by_id(@ids)

答案 1 :(得分:0)

上面的一个答案中的代码片段,“@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,那么值得一看: