2013-08-18 35 views
3

我在ruby 2.0.0,@temp = [3, 4]中有一個數組,我想在SQL IN語句中使用它。所以我想要刪除括號([, ])。使用Ruby數組的SQL查詢IN

我的SQL查詢:

SELECT E.id,E.name, CEU.attempt, E.total_mark, CEU.has_attended as attendance, CE.id as categoryexamId, CE.examtype_id as examType, CU.id as categoryuserId, U.name as username 

     FROM exams E 
     Inner Join categoryexams CE on E.id = CE.exam_id 
     Inner Join categoryexamusers CEU on CE.id = CEU.categoryexam_id 
     Inner Join categoryusers CU on CEU.categoryuser_id = CU.id 
     Inner Join categories C on CE.category_id = C.id 
     Inner Join users U on CU.user_id = U.id 
     Inner Join examtypes ET on CE.examtype_id = ET.id 
     WHERE CE.category_id = #{category_id} AND CEU.has_attended = 1 AND U.id = #{user} AND CE.currentyear = #{academicYear} AND CE.examtype_id = #{examtype}" + (@temp.blank? ? "" : " AND CEU.categoryexam_id NOT IN (#{@temp})") + 
     " Group By CE.id; 
+0

請看這裏 - http://archive.railsforum.com/viewtopic.php?id=14742 –

+2

**你的代碼不安全,並有幾個[SQL注入](https://en.wikipedia.org/wiki/SQL_injection)!! **另請參見[SQL注入的Rails指南部分](http://guides.rubyonrails.org/security.html#sql-injection) –

+0

I f在Rails Active記錄查詢格式中很難轉換這個查詢。你能幫忙嗎? –

回答

7

隨着活動記錄,你可以直接使用「哈希條件」格式時使用的陣列,它會自動將其轉換爲正確的SQL:

MyModel.where(column: [3, 4]) 

見Rails的指南活動記錄查詢"Subset Conditions" 2.3.3

+0

使用Rails Active Record儘可能頻繁地創建您的查詢。這可以保護您免受SQL注入攻擊。 – Kevin

7

如果你想用這個作爲一個字符串,其中查詢。你可以把它寫成:

@temp.join(',') 

希望,它會工作。

+1

-1這允許爲查詢添加更多潛在的SQL注入。 –

+1

你甚至怎麼知道查詢將面臨用戶輸入? – Pak