Estoy usando Kaminari para paginar algunos resultados de una consulta en la que estoy seleccionando registros distintos. Considere el siguiente código de controlador:Obligar a ActiveRecord a contar distinto (con Kaminari)
@things = Thing.joins... # create a complex query that produces duplicate results
# I want to select distinct results: this produces the correct results
@things = @things.select("DISTINCT things.*")
# when Kaminari calls count, it will run "SELECT COUNT(*)", instead of
# "SELECT COUNT(DISTINCT things.*)" we will get the wrong count and extra pages
@things = @things.page(params[:page]).per(10)
La mejor solución que se me ocurre es pasar :distinct => true
a count
, como en this pull request, que fue rechazada por el desarrollador de Kaminari. This SO question discute el problema subyacente. This line of code es la llamada ofensiva al count
.
¿Hay alguna solución alternativa que proporcione a Kaminari el recuento correcto que no implique parchear Kaminari? Gracias.
ACTUALIZACIÓN:
- El uso de un instrumento llamado "recuento" es una gran sugerencia, pero no funciona cuando se le llama en una ActiveRecord :: Relation. Funciona cuando lo llamo a mi clase de modelo, pero eso no ayuda.
¿Se supone que esto es más que un comentario? – apneadiving
Sí, si los OP tuvieran que definir un alcance en el Modelo y nombrarlo contar, entonces podrían controlar lo que hace la biblioteca cuando intenta obtener un recuento del modelo. – LeakyBucket
continúa dando detalles y esto podría estar bien: se supone que las respuestas son claras. De lo contrario, da pistas como comentarios. – apneadiving