# /polls/voters.json devuelve usuarios duplicados en solicitudes paginadas

**URL:** <https://meta.discourse.org/t/polls-voters-json-returning-duplicate-users-across-paged-requests/376636>\
**Category:** Bug\
**Tags:** polls, pr-welcome, rest-api\
**Created:** [30 Julio, 2025 23:06 UTC](https://meta.discourse.org/t/polls-voters-json-returning-duplicate-users-across-paged-requests/376636 "2025-07-30T23:06:16Z")\
**Posts on this page:** 1\
**Showing post:** 8

<div class="post-metadata">

**Author:** ![clechasseur](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/clechasseur/32/517802_2.png) [@clechasseur](https://meta.discourse.org/u/clechasseur)\
**Post date:** [17 Agosto, 2025 22:21 UTC](https://meta.discourse.org/t/polls-voters-json-returning-duplicate-users-across-paged-requests/376636/8 "2025-08-17T22:21:58Z")

</div>

Así que pensé en intentarlo como mi primera contribución, pero parece que podría ser un poco más complicado de lo que esperaba. 😉

Tengo un PR de borrador: [FIX: do not return duplicates from /polls/voters.json by clechasseur · Pull Request #1 · clechasseur/discourse · GitHub](https://github.com/clechasseur/discourse/pull/1)

En este PR, primero agregué pruebas que reproducen el problema, luego apliqué la solución simple de Rob y las pruebas pasaron.

También probé la solución más elegante (la que habría preferido), pero aunque evita los votantes duplicados, también cambia qué votante se devuelve en cada página, incluida la primera, lo que podría considerarse un cambio importante (dependiendo de cómo lo maneje el frontend; aún no lo he mirado).

Sin embargo, dando un paso atrás, me pregunto cuál es el verdadero significado del parámetro `limit` cuando se llama a este endpoint: en realidad no limita el número de votantes _totales_ devueltos, sino solo el número de votantes devueltos _por cada opción de encuesta_. Puede ver este efecto en la prueba que agregué para la encuesta de opción múltiple [aquí](https://github.com/clechasseur/discourse/blob/5ebb4ca9f647dbfa8251ebbe1d9b16fd967fd11c/plugins/poll/spec/lib/poll_spec.rb#L441-L452): la primera página se limita efectivamente a 2 votantes por opción, pero en total se devuelven tres votantes diferentes (distribuidos entre las opciones). Al cambiar a la solución elegante (es decir, usar `LIMIT :limit OFFSET :offset`), el `limit` se aplica al número total de _votos_ y no de votantes. No estoy 100% seguro de que sea mejor o más intuitivo.

De todos modos, soy nuevo en esto, así que quizás lo estoy pensando demasiado. La solución simple elimina los votantes duplicados y no causa demasiados estragos, por lo que podría ser el camino a seguir. Esperaré comentarios antes de enviar un PR al repositorio principal.

–

Aparte, creo que hay otro error en esta parte del código. La consulta para cargar los votantes se ordena por digest, rank y username, pero al ordenar por rank, utiliza esta condición:

```sql
CASE WHEN rank = 'Abstain' THEN 1 ELSE CAST(rank AS integer) END

```

Sin embargo, `'Abstain'` en realidad corresponde al rango 0, no al 1; el rango 1 también puede devolverse como `'1'`. Esto potencialmente hace que el orden sea no determinista entre consultas, lo que significa que, dependiendo del número de votantes y el valor de `limit` utilizado, podría ser posible omitir votantes al realizar consultas paginadas. En mis nuevas pruebas, tuve que ordenar los votantes devueltos para evitar la naturaleza no determinista. (Dado que no es determinista, supongo que no es fácil de reproducir en una prueba, pero puedo intentarlo…).

---

_[View the full topic](https://meta.discourse.org/t/polls-voters-json-returning-duplicate-users-across-paged-requests/376636)._
