ActiveScaffoldの検索で全角英字が検索できない
ActiveScaffoldプラグインで全角英字で検索できないのでなんでかなと思ってたら今日ようやくわかった。
問題は検索条件の文字列を小文字にして検索しようとしていた場所にあった。
vendor/plugins/active_scaffold/lib/finder.rbこのソースのcreate_conditions_for_columns。
columns.each do |column| where_clauses << "LOWER(#{column.search_sql}) LIKE ?" end phrase = "(#{where_clauses.join(' OR ')})" sql = ([phrase] * tokens.length).join(' AND ') tokens = tokens.collect{ |value| [like_pattern.sub('?', value.downcase)] * where_clauses.length }.flatten
上記2行目の検索条件の左辺はDB側のLOWERを使っている。これに対して、右辺に設定される値(上記最後の行)はRubyのdowncaseメソッドを使って小文字に変換しようとしている。
今回使っていたのはPostgreSQL 8.1.11。こいつのLOWER関数は全角も小文字に変換してくれるらしい。(たとえばTESTとい全角英字はtestとなる)
でも、Ruby(1.8.6)の方は全角の英字は小文字に変換してくれない(TESTはTESTのまま)。なので検索しようとしたらtest=TESTとなって検索条件にマッチしない。
ということで、上記2行目を以下のように変更。
where_clauses << "LOWER(#{column.search_sql}) LIKE LOWER(?)"
また、このクラスのcondition_for_columnメソッドにも同じ様な個所があるのでこれも修正。
Ruby側でdowncaseとしているところも不要なので削除。これでようやく全角英字でも検索ができるようになった。問題はしばらく寝かしたらそのうちふっと解けるもんだ。
環境は以下の通り
Ruby 1.8.6 Rails 2.0.2 ActiveScaffold 1.1.1 PostgreSQL 8.1.11