2012-04-24 46 views
1

我使用acts_as_taggable_on,但现在有一个新的要求相同的标记时间:标签的物N使用acts_as_taggable_on

的最终目标:用户应该能够与标签选择其他用户做出了同意,使标签更可信/可靠。

我看到两种方法可以做到这一点:

1)一个办法做到这一点是让一个对象被标记了不止一次同一个标签(即TAG_ID并不需要是在标签上下文中是唯一的)。

我知道如何删除验证在tagging.rb,但我如何更改代码,让多个用户标记同一个标签的对象?这与移除验证一样简单吗?

2)另一种方法是使引用的Tagging voteable使用thumbs_up,这样用户就可以给予好评/ downvote标签化的决定。

这两个看起来很弱,所以我倾向于滚动我自己的标记解决方案,但我宁愿干 - 所以,对哪种方法最好的洞察力,还是我错过了一些简单的方法来做到这一点?

回答

1

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">...] 

记住,作为加标签上使用所有权功能时,所以加入另一@owner_a.tag(:taggable_object, :with => "new,tags"...)会抹去先前标记在@taggable_object项目总覆盖先前标记列表。

相关问题