Railsを使ってると、フリーワード検索はやりにくかったりする。
特に、オブジェクトの関連が絡んでくるとかなり面倒。
で、結局find_by_sqlを使うことになるんだけど、そうなるとパラメータをサニタイジングしないと危なくて使えない。
普通にfindのconditionsオプションでやるときはフレームワークがやってくれるので幸せだが、find_by_sqlだと出来ない。
しょうがないので、たぶんあるだろうとquote()でやってみるも「見つからん」とのことで、APIを読んでみるといろんなところで同一のメソッドが定義されているので、どのクラスのquote()を使うか指定しないといかん。
無難そうなActiveRecord::Baseを使ってみる。
この場合、引き渡されたパラメータをシングルクオートで囲ってくれる。
LIKEで部分一致もしくは、前方、後方一致で検索したいときはこれが引っかかる。
SQLエラーが出ちゃうのだ。
シングルクオートで囲んでほしくないときは、Mysql::quote()を使うのが吉。
DBMSをMySQL以外の時はどうなるんだろ。
ま、ほかを使う気が全くないのでいいけど。
結論
Mysql::quote()を使え。
あらかじめシングルクオートで囲むのがいやならActiveRecord::Base::quote()
PR