0

나는 내 RoR에 응용 프로그램에 많은 SELECT SQL 쿼리를했습니다레일에서 SQL을 살균하는 방법은 무엇입니까?

, 일부는 위와 같이 매우 간단이

@replies = Offerreply.find_by_sql ("SELECT * FROM offerreplies WHERE 
offer_id="+params [:offer_id]) 

같은이 RoR에 세계에 새로운 해요 및 일부 조인 매우 복잡하다. 대부분은 SQL 인젝션 문제로 고통 받고 있습니다. 그렇다면 RoR에서 그러한 SQL 문을 어떻게 위생 처리하는가?

편집 : JOINS 및 하위 쿼리가있는 SQL 문을 처리하는 방법은 무엇입니까? 이 같은 것

@to_be_approved=Beneficiary.find_by_sql("SELECT * FROM beneficiaries WHERE project_id="+params[:id]+" AND NOT id IN (SELECT beneficiaries.id FROM beneficiaries INNER JOIN beneficiaryloans ON beneficiaryloans.beneficiary_id=beneficiaries.id AND beneficiaryloans.hfi_id="+session[:id].to_s+" AND beneficiaries.status_id=4) AND cso_id IN(SELECT user_id FROM user_projects INNER JOIN users ON user_projects.user_id=users.id AND users.user_type_id=2)") 
+0

왜'find_by_sql'을 사용하고 있습니까? 'find' 나'where'를 사용하면 SQL 인젝션에 대해 걱정할 필요가 없습니다. – Mischa

답변

3

레일스 3을 사용하고 있다면 (태그가 말한 것처럼) 이렇게 할 수 있습니다.

@replies = Offerreply.where("offer_id = ?", params[:offer_id]) 

자세한 내용은 at the Rails site을 참조하십시오.

편집 : 조건이 둘 이상인 경우 다음과 같이 할 수 있습니다.

@replies = Offerreply.where("offer_id = ? AND second = ?", params[:offer_id], params[:second]) 

edit2 : 다중 결합에 대한 Micha의 대답을 참조하십시오.

+0

단일 테이블의 경우이 방법이 유용합니다. 조인이 많은 경우 어떻게됩니까? –

+0

답변을 편집했습니다. –

+2

@ShreekumarS - Rails를 사용하려면 [Active Record Query Interface] (http://guides.rubyonrails.org/active_record_querying.html)를 배워야합니다. [조인에 대한 단락은 다음과 같습니다] (http://guides.rubyonrails.org/active_record_querying.html#joining-tables). "정상적인"인터페이스를 통해 수행 할 방법이 없다면'find_by_sql' 만 사용하십시오. – Mischa

3

Waynn Lue의 답변은 훌륭하지만 조인 된 테이블을 쿼리하는 방법은 보여주지 않습니다. 당신은 이런 식으로 작업을 수행 할 수 있습니다

Offerreply.joins(:offers).where('offers.id', params[:offer_id]) 

또는 :

Offerreply.joins(:offers).where(:offers => { :id => params[:offer_id] }) 

을 다시 : 당신이 레일을 사용하려는 경우 당신이 정말로 Active Record Query Interface을 배울 수있다. Here's the paragraph on joins. "정상적인"인터페이스를 통해 수행 할 방법이없는 경우에만 find_by_sql을 사용하십시오.

+0

이 글을 작성해 주셔서 감사합니다. 내 대답에 대한 참고서를 편집하고 upvoted했습니다. :) –

관련 문제