在轨道上构建SQL红宝石
问题描述:
下面的SQL我试图运行时返回的sql_string“SELECT ID从不同人的身份证件(” 16" )“:在轨道上构建SQL红宝石
@ids = ["1", "6"]
sql_string = <<-SQL
SELECT id
FROM people
WHERE id IN ("#{@ids}")
SQL
是否有人可以帮忙修改上述查询,以便它会创建的“SELECT ID从不同人的身份证件(1,6)”
答
只需在查询扔@ids
会连接这些阵列,并给您"16"
的sql_string。你会想运行@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)
的操作。
答
通过上面答案之一中的代码片段,“@ids”未被清理。如果您的代码“知道”“@ids”仅包含有效的整数ID,但是如果来自用户输入或URL的任何ID非常危险,那么这很好。请参阅:
...一个可能的解决方案。这是一个受保护的方法,所以我们必须通过“发送”展示在控制台的使用来电:
>> ActiveRecord::Base.send(:sanitize_sql_for_conditions, { :id => [1,6] }, :people)
=> "people.\"id\" IN (1,6)"
...即。在SQL WHERE关键字之后插入上述结果。正如前面的回答所说,除非你有一个非常复杂的情况,而这个情况不能用标准的Rails调用来建立(Coderama确实是这样,但可能不适合未来的读者),你应该总是尽量避免编写SQL手。
考虑到这一点,要建立复杂的查询的另一种方式是“ez_where”插件,它是值得一试,如果有人阅读正在考虑诉诸SQL的:
感谢提示aNoble。实际上,我正在运行一个复杂的查询来提交报告。为了简洁和排除故障,我使用了一个简单的SQL示例。 谢谢你的解决方案。 .join诀窍! – Coderama 2010-08-22 07:59:00
对SQL注入非常谨慎。有关更多信息,请参阅下面的答案(由于评论引擎不支持所需的格式,因此我无法将其作为评论发布在此处)。 – 2010-08-22 15:42:14