【问题标题】:Tag an object N times with same tag using acts_as_taggable_on使用acts_as_taggable_on用相同的标签标记一个对象N次
【发布时间】:2012-04-24 21:09:41
【问题描述】:

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

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

我看到了两种方法:

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

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

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

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

【问题讨论】:

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


    【解决方案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">...]
    

    请记住,在使用所有权功能时,作为可标记的 on 始终会覆盖先前的标记列表,因此添加另一个 @owner_a.tag(:taggable_object, :with =&gt; "new,tags"...) 将删除 @taggable_object 上先前标记的项目。

    【讨论】:

      猜你喜欢
      • 2012-09-20
      • 1970-01-01
      • 2018-07-26
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多