Cómo encontrar el número de partidos en la etiqueta actúa como el taggable
-
10-10-2019 - |
Pregunta
Tengo dos entradas en mi base de datos
Obj1 está etiquetado con "hola, mundo, planeta" Obj2 está etiquetado con "hola"
si lo hago modelName.tagged_with ([ "hola", "planeta" "mundo", "tierra"],: cualquier => true)
Quiero ordenar los objetos devueltos por orden de mayor a menor número de etiquetas coincidentes. por lo que en este caso me gustaría el fin de ser Obj1, Obj2
¿Cómo puedo hacer esto? ¿hay una manera de obtener el número de etiquetas coincidentes para cada uno de los resultados devueltos?
Solución
Se puede llamar tag_list
sobre los objetos y el uso que para calcular la cantidad de etiquetas que hay:
tags = %w{hello world planet earth}
objs = ModelName.taggedWith(tags, :any => true)
objs.sort_by! { |o| -(tags & o.tag_list).length }
El tags & o.tag_list
produce la intersección de las etiquetas que estamos buscando y los han encontrado etiquetas, entonces nos niega el tamaño de la intersección de decir sort_by
(que tipo en orden ascendente) para poner intersecciones más grandes en la parte delantera, lo que anula el resultado es una manera fácil de invertir el orden habitual.