2012-04-24 44 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項目總覆蓋先前標記列表。

相關問題