如何在Rails中清理SQL?

时间:2012-04-10 06:36:24

标签: sql ruby-on-rails-3 sql-injection sanitization find-by-sql

我是这个RoR世界的新手,

我的RoR应用程序中有很多SELECT sql查询,类似这样

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

有些非常简单,有些是非常复杂的JOINS。他们中的大多数都患有 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)")

2 个答案:

答案 0 :(得分:3)

如果您正在使用Rails 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对多个连接的回答。

答案 1 :(得分:3)

Waynn Lue的答案很好,但它没有显示如何查询连接表。你可以这样做:

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

或者:

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

再次:如果你想使用Rails,你真的必须学习Active Record Query InterfaceHere's the paragraph on joins。如果没有办法通过“普通”接口进行,只能使用find_by_sql。