2012-04-10 11 views
0

Ich bin neu in dieser RoR Welt,Wie man das SQL in Rails Sanitize?

ich wie oben viele SELECT SQL-Abfragen in meiner RoR Anwendung, so etwas wie diese

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

Einige sind sehr einfach haben und einige sind sehr komplex Joins. die meisten von ihnen leiden unter SQL Injection Problem. So., wie solche SQL-Anweisungen in RoR zu sanieren?

Edit: Wie behandelt man in SQL-Anweisungen, die JOINS und Sub-Abfragen hat? so etwas wie dieses

@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

Warum verwenden Sie 'find_by_sql'? Wenn Sie 'find' oder' where' verwenden, müssen Sie sich keine Gedanken über SQL-Injection machen. – Mischa

Antwort

3

Wenn Sie Rails 3 (wie Ihr Tag sagt) verwenden, können Sie es wie folgt tun.

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

können Sie weitere Informationen at the Rails site finden.

edit: Wenn Sie mehr als eine Bedingung haben, können Sie es so machen.

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

edit2: Und siehe Michas Antwort für mehrere Joins.

+0

Das ist in Ordnung für einzelne Tabelle, was ist, wenn ich viele Joins habe? –

+0

Bearbeitete die Antwort. –

+2

@ShreekumarS - wenn Sie Rails benutzen wollen, müssen Sie * wirklich * das [Active Record Query Interface] (http://guides.rubyonrails.org/active_record_querying.html) lernen. [Hier ist der Absatz über Joins] (http://guides.rubyonrails.org/active_record_querying.html#joining-tables). Verwenden Sie 'find_by_sql' nur dann, wenn dies über die" normale "Schnittstelle nicht möglich ist. – Mischa

3

Die Antwort von Waynn Lue ist in Ordnung, aber es zeigt nicht, wie man in verbundenen Tabellen abfragt. Sie können es wie folgt tun:

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

Oder:

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

Nochmal: Wenn Sie verwenden Rails wollen Sie wirklich die Active Record Query Interface zu lernen. Here's the paragraph on joins. Verwenden Sie find_by_sql nur dann, wenn dies über die "normale" Schnittstelle nicht möglich ist.

+0

Danke, dass du dies geschrieben hast, habe eine Referenz in meine Antwort geschrieben und diese aktualisiert. :) –