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 に答える