0

我是这个 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)")
4

2 回答 2

3

如果您使用的是 Rails 3(正如您的标签所说),您可以这样做。

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

您可以在 Rails 站点上找到更多信息。

编辑:如果你有多个条件,你可以这样做。

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

edit2:并查看 Micha 对多个连接的回答。

于 2012-04-10T06:44:42.513 回答
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 Interface这是关于 joins 的段落。如果无法通过“正常”界面执行此操作,请仅使用 find_by_sql。

于 2012-04-10T07:03:54.537 回答