Top > 開発ガイド > Rails Plugins > acts_as_taggable_alternate

acts_as_taggable_alternate

対象バージョン

当ドキュメントはacts_as_taggable_alternate-0.1.1向けです。

概要

Modelに対してタグを付与することを可能にするライブラリです。acts_as_taggble pluginの機能追加版という位置付け(のつもり)です。

ダウンロード

設定手順

DBスキーマ

  • Migrationファイルの生成
    ruby script/generate migration acts_as_taggable_alternate
    
  • Migrationファイルの修正
    class ActsAsTaggableAlternate < ActiveRecord::Migration
      def self.up
        ####################################################################################################################
        # Schema
        ####################################################################################################################
        create_table :tags, :force => true do |t|
          t.column :name,                           :string,    :limit => 255,  :default => '',     :null => false
        end
    
        create_table :taggings, :force => true do |t|
          t.column :tag_id,                         :integer,                   :default => 0,      :null => false
          t.column :taggable_id,                    :integer,                   :default => 0,      :null => false
          t.column :taggable_type,                  :string,    :limit => 255,  :default => '',     :null => false
          t.column :created_at,                     :datetime
          t.column :updated_at,                     :datetime
        end
    
        ####################################################################################################################
        # Indexes
        ####################################################################################################################
        add_index(:tags,        [:name],                        {:name => 'tags_name', :unique => true})
        add_index(:taggings,    [:tag_id],                      {:name => 'taggings_tag_id'})
        add_index(:taggings,    [:taggable_type, :taggable_id], {:name => 'taggings_taggable_type'})
      end
    
      def self.down
        drop_table :taggings
        drop_table :tags
      end
    end
    
  • Migrateの実行
    rake db:migrate
    

Modelへの適用

* acts_as_taggable(options = {})
  * Options
    * :taggable_type
      モデルのクラス名を指定する。基本的にはデフォルト値のままでOK。
      デフォルト値は ActiveRecord::Base.send(:class_name_of_active_record_descendant, self).to_s,

    * :from
      ???
      デフォルト値は nil

  * Examples
    * class SampleModel < ActiveRecord::Base
        acts_as_taggable
      end

利用可能なメソッド

Model(インスタンスメソッド)

* tag_list
  * Note
    インスタンスに付与されているタグを表示します。複数のタグが付与されている場合は、
    半角スペースをデリミタとする文字列で表示されます。

  * Examples
    * sample_model = SampleModel.find(1)
      p sample_model.tag_list

* tag_list=(tags)
* tag_with(tags)
  * Note
    インスタンスに対してタグを付与します。

  * Examples
    * sample_model = SampleModel.new
      sample_model.tag_list = 'tag1 tag2 tag3'

Model(クラスメソッド)

* count_tagged_with(tags, options = {})
  * Note
    指定されたタグを含むレコード数を取得します。

  * Options
    * :match_all
      複数のタグが指定された際に全てのタグにマッチするレコードを検索します。
      default => true

    * :from
    * :limit
    * :lock
    * :offset
    * :order
    * :readonly
      AR#findのオプションと同様です。

    * :conditions
      :conditionsが指定された場合、指定された条件の後ろにタグの抽出条件が追加されます。
      但し、:includeで指定したモデルに関する条件を指定することはできません。
      どうしても条件として必要な場合は:joinsを上手いこと調整してあげて下さい。

    * :include
      :includeが指定された場合、内部ではAR#findが二回実行されます。
      (もっとスマートな解をもっている方はお教え下さい)

    * :group
      タグの抽出条件として使用されていますので、指定する場合は注意して下さい。
      default => "taggings.taggable_id HAVING COUNT(taggings.taggable_id) >= #{tag_list.length}"

    * :joins
      タグの抽出条件として使用されていますので、指定する場合は注意して下さい。
      default => "LEFT OUTER JOIN taggings ON (taggings.taggable_id = #{table_name}.#{primary_key} 
                  AND taggings.taggable_type = '#{name}') LEFT OUTER JOIN tags ON tags.id = taggings.tag_id"

    * :select
      タグの抽出条件として使用されていますので、指定する場合は注意して下さい。
      default => "DISTINCT #{table_name}.*"

* find_tagged_with(tags, options = {})
  * Note
    指定されたタグを含むレコードを取得します。

  * Options
    * :match_all
      複数のタグが指定された際に全てのタグにマッチするレコードを検索します。
      default => true

    * :from
    * :limit
    * :lock
    * :offset
    * :order
    * :readonly
      AR#findのオプションと同様です。

    * :conditions
      :conditionsが指定された場合、指定された条件の後ろにタグの抽出条件が追加されます。
      但し、:includeで指定したモデルに関する条件を指定することはできません。
      どうしても条件として必要な場合は:joinsを上手いこと調整してあげて下さい。

    * :include
      :includeが指定された場合、内部ではAR#findが二回実行されます。
      (もっとスマートな解をもっている方はお教え下さい)

    * :group
      タグの抽出条件として使用されていますので、指定する場合は注意して下さい。
      default => "taggings.taggable_id HAVING COUNT(taggings.taggable_id) >= #{tag_list.length}"

    * :joins
      タグの抽出条件として使用されていますので、指定する場合は注意して下さい。
      default => "LEFT OUTER JOIN taggings ON (taggings.taggable_id = #{table_name}.#{primary_key} 
                  AND taggings.taggable_type = '#{name}') LEFT OUTER JOIN tags ON tags.id = taggings.tag_id"

    * :select
      タグの抽出条件として使用されていますので、指定する場合は注意して下さい。
      default => "DISTINCT #{table_name}.*"

  * Examples
    * sample_model = SampleModel.find_tagged_with('tag1 tag2 tag3')
    * sample_model = SampleModel.find_tagged_with('tag1 tag2 tag3', {:match_all => false})
    * sample_model = SampleModel.find_tagged_with('tag1 tag2 tag3',
                          {:conditions => ['sample_models.category = ?' category], :limit => 50})
    * sample_model = SampleModel.find_tagged_with('tag1 tag2 tag3', {:include => :tags})

* find_popular_tags(options = {})
  * Note
    頻出タグを取得します。

  * Options
    * :period
      特定期間に更新されたタグのみを抽出対象とします。指定方法はAR#validatesと同様です。
      ex) :period => {:in => DateTime.now-7..DateTime.now}

    * :taggable_type
      タグとリンクされているモデルのクラス名を指定します。
      default => ActiveRecord::Base.send(:class_name_of_active_record_descendant, self).to_s

    * :from
    * :include
    * :limit
    * :lock
    * :offset
    * :readonly
      AR#findのオプションと同様です。

    * :conditions
      :conditionsが指定された場合、指定された条件の後ろにタグの抽出条件が追加されます。

    * :group
      タグの抽出条件として使用されていますので、指定する場合は注意して下さい。
      defult => "tags.id, tags.name"

    * :joins
      タグの抽出条件として使用されていますので、指定する場合は注意して下さい。
      defult => "LEFT OUTER JOIN taggings ON tags.id = taggings.tag_id"

    * :order
      タグの抽出条件として使用されていますので、指定する場合は注意して下さい。
      defult => "count desc"

    * :select
      タグの抽出条件として使用されていますので、指定する場合は注意して下さい。
      defult => "tags.id, tags.name, COUNT(*) AS count"

  * Examples
    * tag_list = SampleModel.find_popular_tags
    * tag_list = SampleModel.find_popular_tags({:limit => 50})
    * tag_list = SampleModel.find_popular_tags({:range => {:minimum => Date.today-7}})

View

* render_tag_cloud(options = {}, &block)
  * Note
    タグクラウドを出力するためのヘルパメソッドです。

  * Options
    * :add_level
      タグの使用量に基づいてレベル分けを行うか否かを指定します。
      タグクラウドを出力する場合にはこのレベルによってHTMLのクラス等を分けることで
      タグのスタイルを切り替えることができます。クラウドではなく一覧表示さえできれば
      良い場合、falseにした方がパフォーマンス的に優位です。
      default => true

    * :period
      特定期間に更新されたタグのみを抽出対象とします。指定方法はAR#validatesと同様です。
      ex) :period => {:in => DateTime.now-7..DateTime.now}

    * :sort
      タグのソート方式を指定します。
      default => :name
        :none    => 未ソート(タグの使用量順)
        :name    => タグ名でソート
        :random  => ランダムにソート

    * :taggable_type
      タグとリンクされているモデルのクラス名を指定します。
      default => nil

    * :from
    * :include
    * :limit
    * :lock
    * :offset
    * :readonly
      AR#findのオプションと同様です。

    * :conditions
      :conditionsが指定された場合、指定された条件の後ろにタグの抽出条件が追加されます。

    * :group
      タグの抽出条件として使用されていますので、指定する場合は注意して下さい。
      default => "tags.id, tags.name"

    * :joins
      タグの抽出条件として使用されていますので、指定する場合は注意して下さい。
      default => "LEFT OUTER JOIN taggings ON tags.id = taggings.tag_id"

    * :order
      タグの抽出条件として使用されていますので、指定する場合は注意して下さい。
      default => "count desc"

    * :select
      タグの抽出条件として使用されていますので、指定する場合は注意して下さい。
      default => "tags.id, tags.name, COUNT(*) AS count"

  * Examples
    * <% render_tag_cloud do |tag| %>
        <a href="#<%= h(tag.id) %>" class="tag_level_<%= h(tag.level) %>">
          <%= h(tag.name) %> (<%= h(tag.count) %>)
        </a>
      <% end %>

Controller

* paginate_tagged_with(tags, collection_id, options = {})
  * Note
    指定されたタグを含むレコード及びそのページ管理オブジェクトを取得します。

  * Options
    * :match_all
      複数のタグが指定された際に全てのタグにマッチするレコードを検索します。
      default => true

    * :class_name
    * :conditions
    * :count
    * :include
    * :joins
    * :order
    * :per_page
    * :select
    * :singular_name
      AC#paginateのオプションと同様です。

    * :join
    * :order_by
      AC#paginateのオプションではありますが、使用できません。

  * Examples
    * @pages, @sample_models = paginate_tagged_with('tag1 tag2 tag3', :sample_models)
    * @pages, @sample_models = paginate_tagged_with('tag1 tag2 tag3', :sample_models,
                                 {:conditions => ['category = ?' category], :order => 'sample_models.id asc'})
    * @pages, @sample_models = paginate_tagged_with('tag1 tag2 tag3', :sample_models, {:include => :tags})