プラグイン開発記 - カテゴリ検索の修正

用語集プラグインのカテゴリの検索の不具合の修正。
http://www.r-labs.org/issues/746

用語集ではカテゴリを本当は親子関係にしたかったのだけど、いろいろ面倒なので、ファイルシステムのように / を区切り文字として、擬似的に階層構造にしている。

これで、親カテゴリをフィルタに設定するとサブカテゴリの用語も一緒にヒットするようにしていたが、開発環境の Redmine では上手くいっていたのに環境によっては上手く動作していなかった。
SQL の指定方法か find_by_name 使ったのがまずかったのかなとは思うけど、はっきり原因がわからない。仕方ないので、対象カテゴリを取得するとき、検索はシンプルにして、後で正規表現で絞りこむようしようかなとも思った。けど、ソース眺めても問題なさそうで、問題ないところに手を入れるのもなんなので、とりあえず、そのままにしておいて、先にカテゴリ検索関連で入れたかった改造をいれることにした。


前はカテゴリの選択肢は存在しているカテゴリのみだった。例えば "生物/動物"、"生物/植物" といったカテゴリがあっても、"生物" というカテゴリを自分で作っておかないと選択肢に出てこなかった。
使いづらいかなと思って、どっちかのカテゴリがあれば、"生物"が選択肢として選べるようにした。
改造して、 "生物"で試してみると何故か何もヒットしないバグになってしまった。


ちゃんとバグになったので、最初のデータベースの検索は大雑把にして、正規表現で絞り込むように修正することにした。
まず、フィルタで指定されたカテゴリ名で始まる全てのカテゴリを取得する。
      cats = TermCategory.find(:all, :conditions => ["name LIKE :catname",
{:catname => catname + "%"}])
catname が指定カテゴリで、 検索用 SQL コマンドの LIKE を使っている。 ファイルのフィルタの * ように SQL では任意の文字列は % なので、指定カテゴリ文字の後ろに % を付けている。
"name LIKE #{catname}"というように直接書かないのはサニタイズといってユーザーが入力した文字列を直接 SQL 文に入れないようにする方法。例えば、データベースを壊すような SQL 文を書かれると、それをそのまま SQL 文として実行してしまうため。とはいえ、カテゴリは選択なので、その心配はないのだが、他の文字列の検索と形を合わせている。
この cats のカテゴリのうち、 / が区切りになっているものだけを検索に使う。

この修正で上手く表示できるようになった。多分、環境の違いで出ていたバグもこれで大丈夫だと思う。

Rails Way (Professional Ruby Series)Rails Way (Professional Ruby Series)
(2008/12/04)
Obie Fernandez

商品詳細を見る


Ruby on Rails 逆引きクイックリファレンス Rails 2.0対応Ruby on Rails 逆引きクイックリファレンス Rails 2.0対応
(2008/05/31)
大場 寧子、大場 光一郎 他

商品詳細を見る

関連記事
スポンサーサイト
Prev.    Category    Next 

Facebook コメント


コメント

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
35位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
6位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

05月 | 2017年06月 | 07月
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。