sql - Acts-as-taggable-on encuentra todas las etiquetas por contexto
ruby-on-rails ruby-on-rails-3 (2)
Creo que hay una manera: 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">]
Así que después de buscar una gema de etiquetado para mi aplicación de rieles, encontré la increíble gema de acts-as-taggable . Al instalarlo y jugarlo, descubrí que mantiene todas las etiquetas dentro de una etiqueta db que solo contiene el Tag.name sin el contexto, en lugar de eso, el contexto se mantiene en: a través de la relación db (etiquetado). Para la mayoría de los propósitos puedo ver que esto es perfecto. Excepto con mi aplicación, quiero poder ofrecer al usuario la capacidad de etiquetar basándose en etiquetas preexistentes (por ejemplo, no permitirles crear las suyas propias) y acts-as-taggable no tiene la capacidad de buscar todas las etiquetas dentro de un contexto integrado (por ejemplo, si presentara una autocompletar de la etiqueta db tendría todas las etiquetas incluidas en mi aplicación, lo que no es lo que quiero)
El método a continuación es lo que acabo de concretar para ver si funcionaría (lo que sí funciona), pero me pregunté si me estaba perdiendo algo con acts-as-taggable . Quiero decir que no puedo ver en ningún lugar que ofrezca este método amable.
<% ActsAsTaggableOn::Tagging.find_all_by_context("tags").each do |tagging| %>
<%= tagging.tag %>
<% end %>
Si, por ejemplo, acts-as-taggable no hace esto, ¿es esta la mejor manera de hacerlo? Se siente un poco sin rendimiento. ¿Sería mejor hacer una consulta SQL personalizada en lugar de enrutar a través de acts-as-taggable ?
Si ayuda en todo caso aquí 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)
También puedes 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**)
Añadir límite y orden:
# Get the top 5 tags by count
@tags = YourModel.tag_counts_on(**context**, :limit => 5, :order => "count desc")
Acceda a los conteos con el atributo de count
de las etiquetas devueltas desde tag_counts_on
tag.count