PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Rails:la chiamata .limit(5) cambia l'ordine dei risultati

Supponiamo di provare a ordinare questo array di array in base al primo elemento:

[
  [ 1, 1 ],
  [ 1, 2 ],
  [ 1, 3 ]
]

Entrambi questi (e molti altri) sono risultati validi perché hai chiavi di ordinamento duplicate:

[ [1,1], [1,2], [1,3] ]
[ [1,3], [1,1], [1,2] ]

Stai riscontrando lo stesso problema all'interno del database. Tu dici così:

Quindi quei cinque valori possono apparire in qualsiasi ordine e soddisfare comunque la condizione ORDER BY specificata. Non devono nemmeno uscire dal database nello stesso ordine in due esecuzioni della stessa query.

Se desideri un ordinamento coerente, devi assicurarti che ogni riga del tuo set di risultati abbia una chiave di ordinamento univoca in modo che i pareggi vengano interrotti in modo coerente. Questo è ActiveRecord, quindi avrai un id univoco disponibile in modo da poterlo utilizzare per rompere i tuoi vincoli di ordinazione:

result = Rom::Leaderboard.order('pvp_vs desc, win_percent desc, id').limit(200) 
# --------------------------------------------------------------^^

Questo ti darà un ordine ben definito e unico.