このプラグインは、もともとJonathan VineyによるActs as Taggable on Steroidsに基づいていました。その時点から大幅に進化していますが、多くの人々が使用していた最初のタグ付け機能はすべて彼の功績です。
たとえば、ソーシャルネットワークでは、スキル、興味、スポーツなどと呼ばれるタグがユーザーにある場合があります。タグを区別する実際の方法はないため、このタイプの実装は、ステロイドでタグ付け可能として機能することはできません。
「タグ付け可能として機能」を入力します。特定のキーワード(つまりtags)に機能を結び付けるのではなく、タグ付け可能として機能し、ステロイドが使用されたのと同じ方法でローカルまたは組み合わせて使用できる任意の数のタグ「コンテキスト」を指定できます。
取り付け
これを使用するには、Gemfileに追加します。
gem 'acts-as-taggable-on', '~> 6.0'
and bundle:
bundle
インストール後
移行をインストールする
#最新バージョンの場合:
rake acts_as_taggable_on_engine:install:migrations
生成された移行を確認して、移行します。
rake db:migrate
MySqlユーザーの場合
初期化ファイルを設定することにより、特殊文字の問題623の問題をいつでも回避できます。
ActsAsTaggableOn.force_binary_collation = true
または、このrakeタスクを実行して:
rake acts_as_taggable_on_engine:tag_names:collate_bin
詳細については、「構成」セクションと、古いバージョンのGemに有効な一般的な注意事項を参照してください。
使用法
セットアップ
class User < ActiveRecord::Base
acts_as_taggable_on :tags
acts_as_taggable_on :skills, :interests #モデルごとに複数のタグタイプを設定することもできます
class UsersController < ApplicationController
def user_params
params.require(:user).permit(:name, :tag_list) ## Rails 4の強力なパラメータの使用
end
@user = User.new(:name => "Bobby")
単一のタグを追加および削除する
@user.tag_list.add("awesome") # add a single tag. alias for <<
@user.tag_list.remove("awesome") # remove a single tag
@user.save # save to persist tag_list
配列内の複数のタグを追加および削除する
@user.tag_list.add("awesome", "slick")
@user.tag_list.remove("awesome", "slick")
@user.save
文字列の形式でタグを追加および削除することもできます。これは、文字列内のタグ入力パラメータを処理する場合などに便利です。
この場合、オプションとしてparse:trueを追加する必要があることに注意してください。
文字列内の区切り文字を確認することもできます。デフォルトはカンマなので、ここでは何もする必要はありません。ただし、区切り文字の設定を変更した場合は、文字列が一致することを確認してください。区切り文字について詳しくは、構成を参照してください。
@user.tag_list.add("awesome, slick", parse: true)
@user.tag_list.remove("awesome, slick", parse: true)
また、直接割り当ててタグを追加および削除することもできます。これにより既存のタグが削除されるため、注意して使用してください。
@user.tag_list = "awesome, slick, hefty"
@user.save
@user.reload
@user.tags
=> [#,
#,
#]
モデルでコンテキストを定義すると、コンテキスト内のタグを管理および表示するための複数の新しいメソッドを自由に使用できます。たとえば、:skillコンテキストでは、次のメソッドがモデルに追加されます:skill_list(およびskill_list.add、skill_list.remove skill_list =)、skills(plural)、skill_counts。
@user.skill_list = "joking, clowning, boxing"
@user.save
@user.reload
@user.skills
=> [#,
#,
#]
@user.skill_list.add("coding")
@user.skill_list
=> ["joking", "clowning", "boxing", "coding"]
@another_user = User.new(:name => "Alice")
@another_user.skill_list.add("clowning")
@another_user.save
User.skill_counts
=> [#,
#,
#]
タグが作成される順序を維持するには、acts_as_ordered_taggableを使用します。
class User < ActiveRecord::Base
Alias for acts_as_ordered_taggable_on :tags
acts_as_ordered_taggable
acts_as_ordered_taggable_on :skills, :interests
end
@user = User.new(:name => "Bobby")
@user.tag_list = "east, south"
@user.save
@user.tag_list = "north, east, south, west"
@user.save
@user.reload
@user.tag_list # => ["north", "east", "south", "west"]
使用頻度の高いまたは最も少ないタグを見つける
以下を使用して、最も使用されているタグまたは最も使用されていないタグを見つけることができます。
ActsAsTaggableOn::Tag.most_used
ActsAsTaggableOn::Tag.least_used
メソッドに制限を渡すことで結果をフィルタリングすることもできますが、デフォルトの制限は20です。
ActsAsTaggableOn::Tag.most_used(10)
ActsAsTaggableOn::Tag.least_used(10)
タグ付きオブジェクトの検索
タグ付け可能として機能は、スコープを使用してタグの関連付けを作成します。このようにして、結果をフィルタリングして組み合わせることができます。
class User < ActiveRecord::Base
acts_as_taggable_on :tags, :skills
scope :by_join_date, order("created_at DESC")
end
User.tagged_with("awesome").by_join_date
User.tagged_with("awesome").by_join_date.paginate(:page => params[:page], :per_page => 20)
#指定されたすべてのタグに一致するユーザーを検索します。
#注:これは、指定されたタグの正確なセットを持つユーザーにのみ一致します。ユーザーが追加のタグを持っている場合、それらは返されません。
User.tagged_with(["awesome", "cool"], :match_all => true)
#指定されたタグのいずれかを持つユーザーを検索します。
User.tagged_with(["awesome", "cool"], :any => true)
#awesomeまたはcoolでタグ付けされていないユーザーを検索します。
User.tagged_with(["awesome", "cool"], :exclude => true)
#コンテキストに基づいて任意のタグを持つユーザーを検索します。
User.tagged_with(['awesome', 'cool'], :on => :tags, :any => true).tagged_with(['smart', 'shy'], :on => :skills, :any => true)
:wild => trueオプションを:anyまたは:excludeオプションとともに使用することもできます。 SQLで%awesome%と%cool%を探します。
ヒント:User.tagged_with([])またはUser.tagged_with( '')は、空のレコードセットである[]を返します。
関係
特定のコンテキストの類似したタグに基づいて、同じタイプのオブジェクトを見つけることができます。また、オブジェクトは、一致したタグの総数に基づいて降順で返されます。
@bobby = User.find_by_name("Bobby")
@bobby.skill_list # => ["jogging", "diving"]
@frankie = User.find_by_name("Frankie")
@frankie.skill_list # => ["hacking"]
@tom = User.find_by_name("Tom")
@tom.skill_list # => ["hacking", "jogging", "diving"]
@tom.find_related_skills # => [, ]
@bobby.find_related_skills # => []
@frankie.find_related_skills # => []
ダイナミックタグコンテキスト
定義で生成されたタグコンテキストに加えて、動的タグコンテキストを許可することもできます(これはユーザー生成のタグコンテキストである可能性があります!)
@user = User.new(:name => "Bobby" )
@user 。set_tag_list_on(:customs 、 "same、as、tag、list" )
@user 。tag_list_on(:customs ) #=> ["same"、 "as"、 "tag"、 "list"]
@user.save
ます。tags_on(:customs ) #=> [、...]
@user 。tag_counts_on(:customs )
User.tagged_with("same", :on => :customs) # => [@user]
タグパーサー
タグの解析方法を変更したい場合は、独自の実装を定義できます。
class MyParser < ActsAsTaggableOn::GenericParser
def parse
ActsAsTaggableOn::TagList.new.tap do |tag_list|
tag_list.add @tag_list.split('|')
end
end
end
これで、このパーサーを使用して、パラメーターとして渡すことができます。
@user = User.new(:name => "Bobby")
@user.tag_list = "east, south"
@user.tag_list.add("north|west", parser: MyParser)
@user.tag_list # => ["north", "east", "south", "west"]
#または
@user.tag_list.parser = MyParser
@user.tag_list.add("north|west")
@user.tag_list # => ["north", "east", "south", "west"]
または、グローバルに変更します。
ActsAsTaggableOn.default_parser = MyParser
@user = User.new(:name => "Bobby")
@user.tag_list = "east|south"
@user.tag_list # => ["east", "south"]
タグの所有権
タグは所有者を持つことができます:
class User < ActiveRecord::Base
acts_as_tagger
end
class Photo < ActiveRecord::Base
acts_as_taggable_on :locations
end
@some_user.tag(@some_photo, :with => "paris, normandy", :on => :locations)
@some_user.owned_taggings
@some_user.owned_tags
Photo.tagged_with("paris", :on => :locations, :owned_by => @some_user)
@some_photo.locations_from(@some_user) # => ["paris", "normandy"]
@some_photo.owner_tags_on(@some_user, :locations) # => [#...]
@some_photo.owner_tags_on(nil, :locations) # => Ownerships equivalent to saying @some_photo.locations
@some_user.tag(@some_photo, :with => "paris, normandy", :on => :locations, :skip_save => true) #won't save @some_photo object
オブジェクトを保存しない
所有されているタグの操作
tag_listタグ付けに所有者がいないタグのみを返すことに注意してください。上記の例の続き:
@some_photo 。tag_list #=> []
オブジェクトのすべてのタグを取得するには(所有権に関係なく)、または1人の所有者だけがオブジェクトにタグ付けできる場合は、を使用しますall_tags_list。
所有タグを追加する
所有タグは、文字列内のコンマ区切りタグの形式で一度に追加されることに注意してください。また、所有タグを再度追加しようとすると、以前の所有タグのセットが上書きされるだけです。そのため、既存の所有タグリストにタグを追加するには、次のようにします。
def add_owned_tag
@some_item = Item.find(params[:id])
owned_tag_list = @some_item.all_tags_list - @some_item.tag_list
owned_tag_list += [(params[:tag])]
@tag_owner.tag(@some_item, :with => stringify(owned_tag_list), :on => :tags)
@some_item.save
end
def stringify(tag_list)
tag_list.inject('') { |memo, tag| memo += (tag + ',') }[0..-1]
end
所有するタグを削除する
上記と同様に、削除は次のようになります。
def remove_owned_tag
@some_item = Item.find(params[:id])
owned_tag_list = @some_item.all_tags_list - @some_item.tag_list
owned_tag_list -= [(params[:tag])]
@tag_owner.tag(@some_item, :with => stringify(owned_tag_list), :on => :tags)
@some_item.save
end
汚れたオブジェクト
@bobby = User.find_by_name("Bobby")
@bobby.skill_list # => ["jogging", "diving"]
@bobby.skill_list_changed? #=> false
@bobby.changes #=> {}
@bobby.skill_list = "swimming"
@bobby.changes.should == {"skill_list"=>["jogging, diving", ["swimming"]]}
@bobby.skill_list_changed? #=> true
@bobby.skill_list_change.should == ["jogging, diving", ["swimming"]]
タグクラウドの計算
タグクラウドを構築するには、各タグの頻度を計算する必要があります。クラスで指定acts_as_taggable_onしたためUser、を使用してすべてのタグ数の計算を取得できますUser.tag_counts_on(:customs)。しかし、1人のユーザーの投稿のタグ数が必要な場合はどうでしょうか。これを実現するには、関連付けでtag_countsを呼び出します。
User.find(:first).posts.tag_counts_on(:tags)
タグクラウドの生成を支援するヘルパーが含まれています。
タグクラウドを生成する例を次に示します。
ヘルパー:
module PostsHelper
include ActsAsTaggableOn::TagsHelper
end
コントローラ:
class PostController < ApplicationController
def tag_cloud
@tags = Post.tag_counts_on(:tags)
end
end
見る:
<% 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.0 em ; }
。css2 { font-size:1.2 em ; }
。css3 { font-size:1.4 em ; }
。css4 { font-size:1.6 em ; }
構成
タグ付けを削除した後で未使用のタグオブジェクトを削除する場合は、次を追加します。
ActsAsTaggableOn 。remove_unused_tags = true
強制的にタグを小文字で保存したい場合:
ActsAsTaggableOn 。force_lowercase = true
タグをパラメータ化して保存したい場合(to_paramも再定義できます):
ActsAsTaggableOn 。force_parameterize = true
タグで大文字と小文字を区別し、作成にLIKEクエリを使用しない場合:
ActsAsTaggableOn 。strict_case_match = true
MySqlで特殊文字をカバーする完全一致が必要な場合:
ActsAsTaggableOn 。force_binary_collation = true
テーブル名を指定したい場合:
ActsAsTaggableOn 。tags_table = 'aato_tags'
ActsAsTaggableOn 。taggings_table = 'aato_taggings'
デフォルトの区切り文字を変更する場合(デフォルトは「、」)。(['、'、 '|'])などの区切り文字の配列を渡すこともできます。
ActsAsTaggableOn 。区切り文字 = '、'