我正在尝试运行的以下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)”
答案 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,那么值得一看: