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