ruby-on-rails ruby ruby-on-rails-4 acts-as-taggable-on

ruby on rails - Cómo obtener una lista de todas las etiquetas al usar la gema ''actos-como-etiquetables-en'' en Rails(no en los conteos)



ruby-on-rails ruby-on-rails-4 (3)

Las etiquetas se almacenan en la tabla de etiquetas, a la que accede desde su programa, por ejemplo,

ActsAsTaggableOn::Tag.all

Si necesita más información sobre el uso de etiquetas, también está la tabla

ActsAsTaggableOn::Tagging

que contiene enlaces a donde se usa cada etiqueta, incluido su contexto

Para aplicar esto a tu ejemplo, puedes usar

ActsAsTaggableOn::Tagging.includes(:tag).where(context: ''deshanatags'').map { |tagging| { ''id'' => tagging.tag_id.to_s, ''name'' => tagging.tag.name } }.uniq

Vamos a explicar las diversas partes en esta declaración:

  • el ''include'' asegura que las diferentes etiquetas estén "cargadas de entusiasmo", en otras palabras, que en lugar de cargar n + 1 registros, solo se realizarán 2 consultas en la base de datos
  • el ''donde'' limita los registros a aquellos con el contexto dado
  • el ''mapa'' convierte la matriz de registros resultante en una nueva matriz, que contiene los hashes que solicitó en su problema, con la identificación asignada a la identificación de la etiqueta y el nombre asignado a la etiqueta
  • finalmente, el ''uniq'' se asegura de que no tenga dobles en su lista

Para hacer frente a su problema adicional, al ser taggins sin etiqueta, puede extender la cláusula where a

where("(context = ''deshanatags'') AND (tag_id IS NOT NULL)")

He puesto la gema acts-as-taggable-on en mi modelo de esta manera:

acts_as_taggable_on :deshanatags

Se utiliza el contexto deshanatags . Ahora necesito obtener una lista de todas las etiquetas (no solo las asignadas para un elemento. Lo necesito todo) en este contexto en el siguiente formato:

[ {"id":"856","name":"House"}, {"id":"1035","name":"Desperate Housewives"} ]

¿Cómo puedo hacer esto?

Intenté seguir muchos tutoriales pero llegué a callejones sin salida porque la mayoría de ellos están escritos para Rails 3. Los Rails tienen algunos cambios en el modelo, como la eliminación de attr_accessor, que me dificultan la comprensión de esos tutoriales. Así que por favor ayuda.

Simplemente estoy tratando de agregar la entrada de Jquery Token ( http://loopj.com/jquery-tokeninput/ ) a mi aplicación

PD: A través de la tabla de etiquetado, ¿hay una manera de obtener una lista de etiquetas como la salida de Tag.all filtrando el contexto?


Personalmente, creo que ambas soluciones serán lentas si tiene muchas etiquetas que recuperar ya que hay muchas declaraciones de selección única. Lo haría así:

ActsAsTaggableOn::Tagging.includes(:tag).where(context: ''deshanatags'').uniq.pluck(:id, :name)

Si estás en ruby ​​1.9+

De esta manera acabarás con:

SELECT DISTINCT "taggings"."id", name FROM "taggings" LEFT OUTER JOIN "tags" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."context" = ''deshanatags''

Imo rápido y fácil


Usando el modelo ActsAsTaggableOn::Tagging , puede obtener una lista de todas las etiquetas y filtrarlas según el contexto, luego formatearlas de la siguiente manera:

ActsAsTaggableOn::Tagging.all .where(context: "deshanatags") .map {|tagging| { "id" => "#{tagging.tag.id}", "name" => tagging.tag.name } }

El where nos dará un resultado de todos los etiquetados para un contexto dado, que luego iteramos sobre el uso del map , recuperando la etiqueta relacionada para cada etiquetado en nuestro resultado y obteniendo los atributos de identificación y nombre.

Asegúrese de encadenar los métodos directamente (no a través de varias líneas) si no está usando ruby ​​1.9+

Luego puede llamar a .to_json en el resultado para obtener un objeto json con el formato correcto que puede usar

editar:

Actualicé la publicación para aclarar qué hace cada declaración y también actualicé el formato de nuestro resultado final para usar cadenas como claves en lugar de símbolos