实际上,acts_as_taggable_on gem 支持这个用例。关键是使用标签所有权功能:
@owner_a.tag(@taggable_object, :with => "list,of,tags", :on => :taggable_attribute)
@owner_b.tag(@taggable_object, :with => "list,of,neat,tags", :on => :taggable_attribute)
@taggable_object.taggable_attribute(@some_user, :locations) # => [#<ActsAsTaggableOn::Tag id: 1, name: "list">...]
这将为您提供所有标签的列表,包括来自唯一所有者的重复标签,有效地允许每个用户一次使用特定标签标记对象。
我使用以下内容将该列表转换为具有每个标签计数的唯一标签哈希:
@taggable_object.taggable_attribute.inject(Hash.new(0)) {|h,i| h[i.name] += 1; h } # => { "list" => 2, ... "neat" => 1 }
我使用它来查看用户已经将哪些标签应用于对象,这让我可以确定是否显示向下/赞成图标:
@taggable_object.owner_tags_on(@owner_1, :taggable_attribute); # => [#<ActsAsTaggableOn::Tag id: 1, name: "list">...]
请记住,在使用所有权功能时,作为 taggable on 始终会覆盖以前的标签列表,因此添加另一个@owner_a.tag(:taggable_object, :with => "new,tags"...)
将删除@taggable_object
.