目的
チケットの題名にて、プレフィックスとして、□や、■など、意味を持たせた場合に、
□及び、■を含むチケットのフィルタリングを行いたい。
現状題名の操作にある、『含む』では、
正規表現での□.*というフィルタリングしか行えないため、
汎用性を持たせるため、
題名の操作に正規表現を追加し、
正規表現による題名のフィルタリングを行えるようにする。
作業手順
Ruby on Rails自体、詳細に把握しているわけではないので、出力されたhtmlからボトムアップ的に調査する。
チケット一覧ページのhtmlには、
<legend onclick="toggleFieldset(this);">フィルタ</legend>
とある。
まずは、issuesによるページに含まれるので、
app/models/index.html.erbを見る。
<legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
という行があり、config\locales\ja.ymlにて、
label_filter_pluralをみるとフィルタと関連付けられているため、
ここが当該箇所だと断定。
その下の行を見てみると、
div内でrenderで'queries/filters'を呼んでいる箇所がある。
app\views\queries\_filters.html.erbを見ると、
query.available_filtersに含まれるフィルタ分、GUIを追加している。
題名のフィルタ操作に正規表現を追加したいので、
題名のタイプを見るとテキストになっているため、
テキストの操作に正規表現を追加してやればよい。
そのため、@@operatorsに、
"r" => :label_regexpを追加、
@@operators_by_filter_typeの:textを
:text => [ "~", "!~", "!*", "*", "r" ]に変更。
:label_regexpのため、config\locales\ja.ymlに、
label_regexp: 正規表現を追加。
最終的にSQL文が発行されるので、
sql_for_field関数に以下を追加。
when "r"
sql = "LOWER(#{db_table}.#{db_field}) REGEXP '#{connection.quote_string(value.first.to_s.downcase)}'"
変更前、変更後のソースコードは以下にアップされている。
『チケットの題名を正規表現でフィルタリング』のフォルダにある。
ソースコード
結果
無事追加されている模様。動作に関しても、それっぽく動作している。
と思いきや、REGEXPがマルチバイト対応されていないために、
日本語が含まれている場合に不具合が発生する。
後ほど、マルチバイト対応も記す。
これは素晴らしい機能ですね!マルチバイト対応は、UTF-8ベースで行うことになるのでしょうか?参考になるサイトがあれば、ご紹介いただきたいです。
返信削除