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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top