Railsのtagプラグイン「acts_as_taggable_on_steroids」がgithubに行ってた
Railsでタグといえば、「acts_as_taggable_on_steroids」が有名ですが、
こいつがgithubに行ってました。
参考:jviney/acts_as_taggable_on_steroids · GitHub
インストール
ruby script/plugin install git://github.com/jviney/acts_as_taggable_on_steroids.git
タグ用のテーブルを作成する
ruby script/generate acts_as_taggable_migration rake db:migrate
ざっくり使い方
README読めばわかる。
が、気まぐれで書いてみる。
参考:jviney/acts_as_taggable_on_steroids · GitHub
モデルでこうする
class Post < ActiveRecord::Base acts_as_taggable belongs_to :user end
基本の使い方
p = Post.find(:first) p.tag_list # [] p.tag_list = "Funny, Silly" p.save p.tag_list # ["Funny", "Silly"]
タグの追加/削除
p.tag_list.add("Great", "Awful") p.tag_list.remove("Funny")
Viewでこうする
<%= f.label :tag_list %> <%= f.text_field :tag_list, :size => 80 %>
タグの見つけ方
タグを見つけるには、「find_tagged_with」を使います。
Post.find_tagged_with('Funny, Silly')
なお、タグ検索では、基本的にOR検索となるので、
AND検索をしたい場合は、「:match_all => true」と設定します。
Post.find_tagged_with('Funny, Silly', :match_all => true)
そのほかのメソッドやオプションに関しては、以下のソースを確認のこと。
ActiveRecord::Acts::Taggable::InstanceMethods
※ 俺は見つからないんですが。。。
タグクラウドの作り方
タグクラウドを作成するために、タグの出現頻度を計算する必要があります。
Post全体のタグに関しては、「Post.tag_counts」を使用します。
また、個々のユーザのPostのためのtag_countsについては、以下のように記述します。
User.find(:first).posts.tag_counts
※ 一見、不思議ですな。
ApplicationHelperでincludeしておく。
module ApplicationHelper include TagsHelper end
以下のようにすることで、データベース内のすべてのタグの数を計算することができます。
Tag.counts
タグクラウドのサンプル
Controller:
class PostController < ApplicationController def tag_cloud @tags = Post.tag_counts end end
View:
<% tag_cloud @tags, %w(css1 css2 css3 css4) do |tag, css_class| %> <%= link_to tag.name, { :action => :tag, :id => tag.name }, :class => css_class %> <% end %>
CSS:
.css1 { font-size: 1.0em; } .css2 { font-size: 1.2em; } .css3 { font-size: 1.4em; } .css4 { font-size: 1.6em; }
キャッシュもできます
タグに関するリクエストが多い場合、キャッシュを使うことで負荷を軽減できます。
キャッシュを扱う場合、タグ付けする予定のモデルに対し、キャッシュ用のカラムを追加します。
なお、デフォルト値は、nullでなければなりません(null => falseとかしないように)。
class CachePostTagList < ActiveRecord::Migration def self.up add_column :posts, :cached_tag_list, :string end end class Post < ActiveRecord::Base acts_as_taggable # The caching column defaults to cached_tag_list, but can be changed: # # set_cached_tag_list_column_name "my_caching_column_name" end
ただし、通常はこれを使わず、「tag_list」を使ったほうがよいでしょう。
キャッシュ用のカラムは、タグが追加されても自動で更新されるわけではなく、
以下のように手動で行う必要があります。
# ...@postに対するtagの更新など @post.save_cached_tag_list
タグの区切り文字を変更する
config/environment.rb:
TagList.delimiter = " "
タグを使わないとき
以下を変更する。デフォルトはfalse.
Tag.destroy_unused = true
超意訳でした。おわり。