2010-08-22 175 views
1

下面的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)

回答

2

只需在查询扔@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)的操作。

+0

感谢提示aNoble。实际上,我正在运行一个复杂的查询来提交报告。为了简洁和排除故障,我使用了一个简单的SQL示例。 谢谢你的解决方案。 .join诀窍! – Coderama 2010-08-22 07:59:00

+0

对SQL注入非常谨慎。有关更多信息,请参阅下面的答案(由于评论引擎不支持所需的格式,因此我无法将其作为评论发布在此处)。 – 2010-08-22 15:42:14

0

通过上面答案之一中的代码片段,“@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的: