Как удалить тег из списка тегов плагина act_as_taggable? - PullRequest
7 голосов
/ 21 января 2010

Я пытался уничтожить теги из данного кода, но он не работает. Как это можно сделать?

 @tag = Tag.find_by_name(params[:name])
  @tag.destroy
  render :update do |page|
    page[:divtag].innerHTML = render :partial => "controls/tag_list"
  end

Ответы [ 3 ]

13 голосов
/ 22 января 2010

Пример, который вы предоставили, кажется неверным. Обычно у вас есть список тегов, принадлежащих модели (скажем, модель пользователя). Тогда вы могли бы назвать что-то вроде этого:

# Find a user
@user = User.find_by_name("Bobby")
# Show available tags
@user.tag_list # => ["awesome", "slick", "hefty"] as TagList
# Remove the "slick" tag
@user.tag_list.remove("slick")
# Store change
@user.save

Дополнительную информацию смотрите в readme * as-taggable-on (к сожалению, удаление тегов не объясняется).

3 голосов
/ 27 января 2016

ActsAsTaggableOn не имеет хорошего способа сделать это встроенным (что я могу найти). Вот как я это сделал:

Сначала найдите теги, которые вы хотите удалить. Это должно быть Array или ActsAsTaggableOn::Tag::ActiveRecord_AssociationRelation

Если вы внедрили acts_as_tagger:

tags = @user.owned_tags.where(name: my_array_of_tag_names)

Если вы хотите найти теги у всех владельцев (или не используете acts_as_tagger):

tags = ActsAsTaggableOn::Tag.where(name: my_array_of_tag_names)

Затем вы просматриваете теги, находите все теги и delete их, а затем, наконец, delete тег. (Обратите внимание, что destroy не будет работать в этом случае)

tags.each do |tag|
  ActsAsTaggableOn::Tagging.where(tag_id: tag.id).delete_all
  tag.delete
end
2 голосов
/ 20 сентября 2012

Если вы заинтересованы в удалении всех тегов, вы можете отправить delete_all в отношение.

Краткий пример

> resource.grades.delete_all
> resource.reload
> resource.grades
=> []

Длинный пример

> resource.grades
=> [#<ActsAsTaggableOn::Tag id: 336486, name: "Kindergarten", context: nil, sort: 0>,
 #<ActsAsTaggableOn::Tag id: 336506, name: "Pre-K", context: nil, sort: 0>]
> resource.grades.delete_all
   (0.3ms)  BEGIN
  SQL (0.5ms)  DELETE FROM `taggings` WHERE `taggings`.`taggable_id` = 984643 AND `taggings`.`taggable_type` = 'Resource' AND `taggings`.`tag_id` IN (336486, 336506) AND (taggings.context = 'grades')
   (0.2ms)  COMMIT
=> [#<ActsAsTaggableOn::Tag id: 336486, name: "Kindergarten", context: nil, sort: 0>,
 #<ActsAsTaggableOn::Tag id: 336506, name: "Pre-K", context: nil, sort: 0>]
> resource.reload
  Resource Load (0.6ms)  SELECT `resources`.* FROM `resources` WHERE `resources`.`id` = 984643 LIMIT 1
=> #<Resource id: ...>
> resource.grades
  ActsAsTaggableOn::Tag Load (0.6ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`taggable_id` = 984643 AND `taggings`.`taggable_type` = 'Resource' AND (taggings.context = 'grades')
=> []
...