使用acts_as_taggable_on使用相同标记将对象标记N次

时间:2012-04-24 21:09:42

标签: ruby-on-rails tagging acts-as-taggable-on

我正在使用acts_as_taggable_on,但现在有了新的要求:

最终目标:用户应该能够同意其他用户所做的标记选择,从而使标记更可靠/可靠。

我认为有两种方法可以做到这一点:

1)执行此操作的一种方法是让对象使用相同的标记多次标记(即,tag_id在标记上下文中不需要是唯一的)。

我知道如何删除tagging.rb中的验证,但是如何更改代码以让多个用户使用相同的标记标记对象?它是否像删除验证一样简单?

2.。)另一种方法是使用thumbs_up使标签可以投票,这样用户就可以对投标决定进行投票/投票。

这两个看起来都很弱,所以我倾向于使用我自己的标记解决方案,但我宁愿干 - 所以,对哪种方法最好的任何见解,或者我错过了一些简单的方法来做到这一点? / p>

1 个答案:

答案 0 :(得分: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">...]

请记住,在使用所有权功能时,充当taggable on始终会覆盖之前的标记列表,因此添加另一个@owner_a.tag(:taggable_object, :with => "new,tags"...)会删除@taggable_object上之前标记的项目。