blog.takuyan.com

Ruby & Javascript & Hack

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


超意訳でした。おわり。