2010-08-22 182 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的: