2012-04-24 2 views
1

Я использую acts_as_taggable_on, но теперь есть новое требование:Тэг объект N раз с таким же тэгом, используя acts_as_taggable_on

Конечная цель: Пользователи должны иметь возможность согласовать с выбором тегов другой пользователь сделал , что делает отметку более надежной/надежной.

Я вижу два способа сделать это:

1) Один из способов сделать это было бы, чтобы объект будет помечен более чем один раз с тем же тегом (т.е. tag_id не нужно быть уникальный в контексте тегирования).

Я знаю, как удалить проверку в tagging.rb, но как изменить код, чтобы позволить нескольким пользователям пометить объект с тем же тегом? Это так же просто, как удаление проверки?

2.) Другой способ заключается в том, чтобы сделать отметки с голосом, используя thumbs_up, чтобы пользователи могли повышать/понижать значение пометки.

Оба они кажутся слабыми, поэтому я склоняюсь к тому, чтобы катить свое собственное решение по методам, но я предпочел бы СУХОЙ - так, какие-либо сведения о том, какой метод лучше, или я пропустил какой-то простой способ сделать это?

ответ

1

Драгоценности act_as_taggable_on поддерживают этот прецедент, фактически. Ключ использует функцию собственности тегов:

@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 } 

я использую это, чтобы увидеть, какие теги пользователь уже применяется к объекту, который позволяет мне определить с, чтобы показать значок вниз/upvote:

@taggable_object.owner_tags_on(@owner_1, :taggable_attribute); # => [#<ActsAsTaggableOn::Tag id: 1, name: "list">...] 

Помните, что действует как taggable на всегда перезаписывает предыдущий список тегов при использовании функции собственности, так что добавление другого @owner_a.tag(:taggable_object, :with => "new,tags"...) сотрет ранее отмеченные элементы на @taggable_object.