2011-01-04 8 views
16

Así que después de buscar una gema de etiquetado para mi aplicación de rieles encontré la increíble gema acts-as-taggable. Al instalarlo y jugar, descubrí que mantiene todas las etiquetas dentro de una etiqueta db que solo contiene Tag.name sin el contexto, en cambio el contexto se mantiene en la relación: through db (taggings). Para la mayoría de los propósitos, puedo ver que esto es perfecto. Excepto con mi aplicación, quiero poder ofrecerle al usuario la capacidad de etiquetar en base a etiquetas preexistentes (p. Ej., No permitirle que cree las suyas propias) y acts-as-taggable no tiene la capacidad de buscar todas las etiquetas dentro de un contexto creado (por ejemplo, si tuviera que presentar una autocompletación de la etiqueta db, incluiría todas las etiquetas en mi aplicación, que no es lo que quiero)Acts-as-taggable-on encuentra todas las etiquetas por contexto

El siguiente método es lo que acabo de ver para ver si funcionaría (lo cual es cierto), pero me pregunté si me faltaba algo con acts-as-taggable. Quiero decir que no puedo ver ningún sitio que ofrezca este tipo de método.

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

Si, por ejemplo acts-as-taggable no hacer esto, es ésta la mejor manera de hacer esto? Se siente un poco no rendimiento, ¿Sería mejor hacer una consulta SQL personalizada en lugar de enrutar a través de acts-as-taggable?

Si ayuda en absoluto heres una cola de mi registro:

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) 

Respuesta

16

También es posible usar una declaración como la siguiente:

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

límite Agregar y orden:

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

Acceda a los recuentos con el atributo count de las etiquetas devueltas desde tag_counts_on

tag.count 
+1

Esta solución todavía necesita las instancias de modelo para ser marcadas antes. ¿Cómo definiríamos ciertas etiquetas predefinidas para un contexto dado? – bibstha

0

Creo que hay cierto: 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">] 
Cuestiones relacionadas