rails-pluginモデルにタグ付けの機能がつくacts_as_taggableの機能追加版であるacts_as_taggable_on_steroidsの使い方を整理してみた。導入プラグインをインストールしてマイグレーションでデータベースの準備。acts_as_taggable_migrationこれでマイグレーション用のファイルができるのでマイグレーション。db:migrate導入は以上。acts_as_taggableモデルに「acts_as_taggable」と一行追加。acts_as_taggableendこれでそのモデルのオブジェクトにタグ付けできるようになる。tag_listtag_listを介してタグ付けと付けたタグの参照ができる。タグ付けtag_listにタグのリストを代入するとモデルオブジェクトにタグが付く。モデルオブジェクトをsaveするとタグも保存される。よいitem.save以下タグのリストに関する仕様。付けたタグはtag_listで参照できる。"ペグ"]文字列で欲しい場合はto_s。デリミタで区切られた文字列で返される。ペグ"デリミタが半角スペース以外の時にはデリミタとタグの間に半角スペースが入った形になる。toggleタグリストへの追加や削除を行うためのメソッドが用意されている。モデルオブジェクトにすでにタグが付いているときなど、既存のタグリストに対して簡単にタグの追加や削除を行ったりすることができるので便利。tag_list.addで追加。"コールマン"]tag_list.removeで削除。指定したタグがタグのリストの中に存在していなくてもエラーにはならない。"ペグ"]tag_list.toggleでトグルなんてこともできる。find_tagged_withfind_tagged_withを使うと付いているタグからレコードを取得できる。引数にはタグを指定する。「テント」のタグが付いているレコードを取得find_tagged_withには通常のfindと同じく:conditions、:order、:limitなどを設定することが可能。複数のタグを指定すると、デフォルトではそれらタグのどれかがついているレコードを取得する。OR条件での取得になる。true」を指定する。すると指定されたタグがすべて付いているレコードのみ取得する。「テント」でかつ「本体」両方のタグを持つレコードを取得ページネーション取得したデータのページネーションはwill_paginateを使っていると簡単。find_tagged_withに続けてpaginateを使う。コントローラには次のように書く。:conditionsや:orderなどはfind_tagged_withの方に含める。20)ビューで次のように書く。true」とあわせて使うことができないようだ。tag_countsタグクラウドのようなタグの一覧を作ったりするためにタグの使用回数が集計されたリストを取得することができる。すべてのタグを取得Tag.countsですべてのタグの集計を取得できる。返値はTagモデルオブジェクトの配列。個別のタグにはタグ名と使われている回数の情報が含まれており、それらはTagモデルのオブジェクトのメソッドで取得できる。テント(123)複数のモデルにタグ機能を付けている場合はすべてのモデルに付いているタグが全部出てくる。この取得の仕方はあまりしない方がいいだろう。複数のモデルをまたいでタグの集計リストを取得するという明確な意図がある場合は別だが。あるモデルのレコードに付けられているすべてのタグを取得モデルのクラスメソッドでtag_countsというメソッドが使えるようになっているのでこれを使う。そのモデルに付いているタグのみを取得するという以外はTag.countsと同じ。テント(123)tag_countsのオプションtag_countsにはいろいろオプションがある。:start_atタグ付けされた日時が指定した日時以降のタグのみ対象に取得:end_atタグ付けされた日時が指定した日時以前のタグのみ対象に取得:conditionsfindと同じようにwhere条件を指定。モデルのカラムの他、tags.nameやtaggings.created_atなどのカラムも条件に含めることができる。:limit取得件数の制限。findで指定するのと同じ。:orderソート条件の指定。findで指定するのと同じ。:at_leastタグのついているレコード数が指定した数値以上のタグのみを対象に取得:at_mostタグのついているレコード数が指定した数値以下のタグのみを対象に取得これらを使うことでいろいろな条件で集計が可能。タグごとにタグ付けされた日時が保存されているので例えば月間ごとにタグクラウドを出したりとかそんなこともできる。関連と一緒に使うこともできる。Category.find_by_name('テント・タープ').items.tag_counts楽でよろしい。tag_cloud用意されているtag_cloudヘルパーを使うことでタグクラウドを簡単に作ることができる。tag_cloudヘルパーはTagsHelperをインクルードすると使用可能となる。tag_cloudヘルパーの引数にはTag.countsの返値とCSSクラスの配列を与え、ブロックを渡す。TagsHelperendビューで次のように使う。%>対応するCSSは以下。Item.tag_counts」の箇所は実際にはコントローラ内に書くと思うがサンプルと言うことでひとつ。CSSクラスの数は任意に変更でき大きさの段階を細かくしたい場合には増やせば、粗くしたい場合は減らせばよい。TagList.delimiterTagList.delimiterの値を変更することでタグのデリミタを変更できる。半角スペースにしたい場合は次のように。"デリミタはいつでも変更できるが基本的に使っている途中で別のものに変更するとかは考えにくいのでconfig/environment.rbに書くのが普通だろう。タグのキャッシュと使われなくなったタグの削除パフォーマンスなどに関わるデータベース周りの話。タグリストのキャッシュタグをモデルのテーブルに文字列としてキャッシュすることができる。モデルについているタグを参照するときにタグテーブルにアクセスしにいかなくなるのでパフォーマンス的に助かる。このキャッシュと使うためには単に「cached_tag_list」という文字列型のカラムをモデルのテーブルに作ればよい。以下のようなマイグレーションで。ひとつのオブジェクトにつくタグの数が多い場合はカラムのサイズに注意すること。endendカラムがあれば自動的にキャッシュされるようになる。タグリストを変更した場合にはキャッシュの内容も自動的に変更されるので、キャッシュを使っていると意識する必要はまずない。何らかの事情でカラムの名前を変えたければset_cached_tag_list_column_nameを使う。"tags_cache"endカラムが存在しなくてもエラーにはならない。なければキャッシュが働かないと言うだけ。使われなくなったタグを自動的に削除するいったん作られたタグはモデルオブジェクトのタグリストから削除されて、まったく使われなくなってもtagsテーブルに残り続ける。これが目障りなら以下のコードをどこかに書いておけば使われなくなったタグは自動的に削除される。trueconfig/environment.rb辺りに書いておけばよいと思う。この削除はタグリストから削除されたタイミングで行われるので、destroy_unusedをtrueにする前に使われなくなったタグはやっぱりそのまま残り続ける。パフォーマンスに影響が出ているとか何らかの問題がなければ残りっぱなしでほっといてもかまわんと思う。テストカバレッジを調べるを見てrcovを試してみたら面白かった。テスト:selectで取得するカラムを絞ったらパフォーマンスが倍に最近管理しているDBサーバで継続的にスロークエリが出るようになったので、チューニングしてみたら気持ちの良い結果が出た。パフォーマンスチューニングRails2.0でGoogleサイトマップとかのsitemap.xml作る今日はsitemap.xmlを作ってたのでRailsでGoogleサイトマップを作るネタで書こうと思ってたら、以下のページでけっこう昔にすでに書かれてて俺涙目。PMお役に立てて何よりです。ところでfind_tagged_withの後にpaginate使うと該当レコード全部持ってきてからページネーション処理に入るからパフォーマンス的にあんまりよくないとかけっこう前に気がついたけどめんどくて修正してなかったりします。AM参考になりました。細かい話ですがtag_cloud関数の表示部分に不要な「(」があるようです。PMおお、ご指摘ありがとうございます。引数は括弧で囲う派なのでむしろ末尾の「)」が抜けていたかんじです。基本的には試したコードを載せているんですが、ブログの編集中に変数名などを修正することがあって壊れちゃうときがあるんですよね。検索:書いてる人サーバーサイドのインフラ構築とプログラミングをたしなむハーフスタックくらいのフリーランスプログラマー。カメラはペンタックス。