2010-01-21 19 views
6

Verilen koddan etiketleri yok etmeye çalıştım ancak çalışmıyor. Nasıl başarılabilir? Sağladığınız örnek bozuk gibi görünüyor.Etiketi act_as_taggable eklentisinin etiket listesinden nasıl silebilirim?

+0

Bu nedir? Act_as_tagg * plugin? Bu konuda biraz daha bilgi verebilir misiniz? '@ tag.destroy' etiketi silmeli, başka bir şey müdahale etmelidir. – Veger

+0

Heh yanlışlıkla içine gömüldü: eylemler-olarak-etiketlenebilir – Veger

+0

evet arkadaşının adı daha iyi değiştirirsiniz, aynı "eylemler-etiketlenebilir" eklenti, params adını alarak bunu aldım ve gibi hata gösterebilir –

cevap

13

Normalde bir Modele ait etiketlerin bir listesi vardır (Kullanıcı modelini söyleyelim). Daha fazla bilgi için

# 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 

(maalesef etiketlerini çıkarmadan izah edilmez) acts-as-taggable-on readme bakmak: O zaman böyle bir şey diyebiliriz.

+2

teşekkür "nil Fixnum zorlandığını edilemez" ama ans met diğer yolu çözme, @tag = Tag.find_by_name (params [: adı]) var @taggings = Etiketleme. find_all_by_tag_id (@ tag.id) tag.delete uç ucu @ @taggings içinde tagging.delete ucu etiketleme –

2

Tüm etiketleri silmek istiyorsanız, ilgili alana delete_all gönderebilirsiniz.

Kısa örnek

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

Uzun örnek

> 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') 
=> [] 
3

ActsAsTaggableOn (ı bulabilmesi) inşa Bunu yapmak için iyi bir yol yoktur. İşte ben nasıl yaptım:

Önce silmek istediğiniz etiketleri bulun. Bu olması gereken bir Array veya ActsAsTaggableOn::Tag::ActiveRecord_AssociationRelation

Eğer acts_as_tagger uyguladıysanız:

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

tüm sahipleri tarafından etiket bulmak istiyorum (veya acts_as_tagger kullanmıyorsanız) ise:

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

Daha sonra etiketler arasında geçiş yapar, tüm etiketlemeleri bulup delete onları ve son olarak Etiketi delete. (Bu durumda destroy çalışmaz unutmayın)

tags.each do |tag| 
    ActsAsTaggableOn::Tagging.where(tag_id: tag.id).delete_all 
    tag.delete 
end 
İlgili konular