Top > 開発ガイド > Rails Plugins > acts_as_taggable_alternate
acts_as_taggable_alternate
対象バージョン
当ドキュメントはacts_as_taggable_alternate-0.1.1向けです。
概要
Modelに対してタグを付与することを可能にするライブラリです。acts_as_taggble pluginの機能追加版という位置付け(のつもり)です。
ダウンロード
- http://rubyforge.org/projects/rubricks/
- svn://dev.rubricks.org/var/svn/rubricks/plugins/acts_as_taggable_alternate/trunk/acts_as_taggable_alternate/
設定手順
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})
