私はこのようなクエリを実行しようとしています:ActiveRecord.findのa:conditions引数にどのように%を使用できますか?
Widget.find(:all, :conditions => ["name like %awesome%"])
しかし、私は問題として「%」を指定し、sanitize_sqlから「不正な形式のフォーマット文字列」の例外を取得しています。
このクエリはどのように実行できますか?
私はこのようなクエリを実行しようとしています:ActiveRecord.findのa:conditions引数にどのように%を使用できますか?
Widget.find(:all, :conditions => ["name like %awesome%"])
しかし、私は問題として「%」を指定し、sanitize_sqlから「不正な形式のフォーマット文字列」の例外を取得しています。
このクエリはどのように実行できますか?
この構文は次のとおりです。
文字列%awesome%
編集周り
Widget.find(:all, :conditions => ["name like '%awesome%'"])
ただ、追加の単一引用符を試してみてください: [OK]を、それはdoesnの; tは、実際に働いています。 sqlのサニタイザは、%sで何かをしています。
これは動作します。
Widget.find(:all, :conditions => ["name like ?","%awesome%"])
John Topleyの回答ごとに、実際に必要な場合は文字列を可変にすることができます。
SQLエラーが発生したときに役立つヒントはdevelopment.log
です。実際にデータベースに対して実行されているすべてのクエリがリストされます。 SQLの基本知識があれば、ActiveRecordレベルでスタブを作成するのではなく、コンソールで直接デバッグすると便利なことがよくあります(私の場合は、その段階に入る前にコードがバーフィングしていたと思いますが)。
一重引用符を追加しても役立たないようです:-( – kdt
@jcs - ログのSQL文として報告されるもの – DanSingerman
%awesome%の引用符がないため、ソリューションが動作しません。
ありがとうございます、それは完全に機能します。 – kdt
Railsは、条件(つまりパーセント記号)のSQLを解析しません。条件にパラメータを渡す必要があります。 –
上記の構文を使用すると、Johnが示唆したとおりですRailsは、ユーザーがSQLインジェクション攻撃を行えないように、エスケープ文字で入力をサニタイズすることができます。このプロセスでは、入力を引用符で囲みます。これは潜在的な問題を避けるために使用するメソッドです。 –