2011-01-04 2 views
16

Donc, après la recherche d'une gemme de marquage pour mon application rails, j'ai trouvé l'incroyable acts-as-taggable gem. En l'installant et en jouant, j'ai découvert qu'il garde toutes les balises dans un tag db qui ne contient que le tag.name sans le contexte, au contraire le contexte est maintenu dans la relation: through db (taggings). Pour la plupart des objectifs, je peux voir que c'est parfait. Sauf avec mon application, je veux être en mesure d'offrir à l'utilisateur la possibilité de marquer en fonction d'une balises préexistantes (par exemple, ne pas leur permettre de créer leur propre) et acts-as-taggable n'a pas la possibilité de rechercher toutes les balises dans un contexte construit dans (par exemple, si je devais présenter une auto-complétion de la balise db j'aurais inclus toutes les balises dans mon application qui n'est pas ce que je veux)Agit-comme-taggable-sur trouver tous les tags par contexte

La méthode ci-dessous est ce que je viens d'étoffer pour voir si cela fonctionnerait (ce qui est le cas) mais je me demandais s'il me manquait quelque chose avec acts-as-taggable. Je veux dire que je ne peux pas voir n'importe où qui offre cette méthode aimable?

<% ActsAsTaggableOn::Tagging.find_all_by_context("tags").each do |tagging| %> 
    <%= tagging.tag %> 
<% end %> 

Si, par exemple acts-as-taggable ne le fait pas, est-ce la meilleure façon de le faire? Il se sent un peu non performant, Serais-je mieux de faire une requête SQL personnalisée au lieu de routage à travers acts-as-taggable?

Si elle aide à tous Heres une queue de mon journal:

Started GET "/users" for 127.0.0.1 at 2011-01-04 14:46:20 +0000 
Processing by UsersController#index as HTML 
SQL (0.5ms) SELECT name 
FROM sqlite_master 
WHERE type = 'table' AND NOT name = 'sqlite_sequence' 
User Load (0.1ms) SELECT "users".* FROM "users" 
ActsAsTaggableOn::Tagging Load (0.5ms) SELECT "taggings".* FROM "taggings" WHERE ("taggings"."context" = 'languages') 
ActsAsTaggableOn::Tag Load (0.1ms) SELECT "tags".* FROM "tags" WHERE ("tags"."id" = 2) LIMIT 1 
Rendered users/index.html.erb within layouts/application (10.4ms) 

Répondre

16

Vous pouvez également utiliser une déclaration comme ce qui suit:

# Returns all the tags for the specified model/context with a count >= 1 
@tags = YourModel.tag_counts_on(**context**) 

limite Ajouter et l'ordre:

# Get the top 5 tags by count 
@tags = YourModel.tag_counts_on(**context**, :limit => 5, :order => "count desc") 

Accéder aux comptages avec l'attribut count des balises renvoyées par tag_counts_on

tag.count 
+1

Cette solution doit encore être étiquetée les instances de modèle avant. Comment définir certaines étiquettes prédéfinies pour un contexte donné? – bibstha

0

Je crois qu'il ya la manière: User.tag_counts_on(:tags)

=> [#<ActsAsTaggableOn::Tag id: 1, name: "foo">, 
#<ActsAsTaggableOn::Tag id: 2, name: "bar">, 
#<ActsAsTaggableOn::Tag id: 3, name: "sushi">, 
#<ActsAsTaggableOn::Tag id: 4, name: "pizza">] 
Questions connexes