1

我正在使用acts_as_taggable_on,但现在有一个新要求:

最终目标:用户应该能够同意另一个用户所做的标签选择,使标签更加可信/可靠。

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

1) 做到这一点的一种方法是让一个对象用相同的标记多次标记(即,tag_id 在标记上下文中不需要是唯一的)。

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

2.) 另一种方法是使用thumbs_up使标记可投票,因此用户可以对标记决定投赞成票/反对票。

这两个似乎都很弱,所以我倾向于推出我自己的标记解决方案,但我宁愿干——所以,任何关于哪种方法最好的见解,或者我错过了一些简单的方法来做到这一点?

4

1 回答 1

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.

于 2012-04-30T22:33:06.783 回答