Sto cercando una risposta che restituirà un array di oggetti utente tramite (preferibilmente) un named_scope o tramite un metodo di classe sul modello User che esegue alcune manipolazioni.Restituire array di oggetti tramite named_scope - has_many ... appartiene_a associazione; UNION ALL query
Quindi, senza ulteriori indugi ...
Ho due tabelle: utenti e combattimenti.
- utente ha molte lotte (has_many: combattimenti,: foreign_key => 'challenger_id o challengee_id')
- Lotta appartiene all'utente (belongs_to: challenger,: class_name => 'utente' ... belongs_to: challengee ,: class_name => 'utente')
lotta ha le seguenti colonne di preoccupazione:
- challenger_id (user_id fk)
- chall engee_id (user_id fk)
- challenger_won (booleano)
Come si può vedere, un utente può essere un challenger o un challengee, ma non entrambi.
- Se l'utente è uno sfidante e lo sfidante_voce = vero, allora è considerato una vittoria.
- Se l'utente è una sfida e il challenger_won = falso, allora è considerato una vittoria.
- Se challenger_won = null, ignorarlo.
Ho una dichiarazione grezzo SQL che restituisce un attributo di caccia (l'user_id) raggruppati per maggior numero di vittorie attributo:
SELECT a.fighter, COUNT(*) AS wins
FROM (SELECT challenger_id AS fighter
FROM fights
WHERE challenger_won = TRUE
UNION ALL
SELECT challengee_id AS fighter
FROM fights
WHERE challenger_won = FALSE
) AS a
GROUP BY a.fighter;
Quindi, dato queste informazioni, come posso restituire un array di oggetti utente tramite (preferibilmente) un named_scope o tramite un metodo di classe sul modello User che esegue qualche manipolazione?
pensare di cambiare la colonna 'challenger_won' nella' tabella di fights', ad un 'winner_id' (user_id fk) che farà accertamento vince molto più pulito . Potresti quindi avere un 'has_many: wins,: class_name => 'Fight',: foreign_key => 'winner_id'' che ti permetterà di fare' user.wins.count' per trovare le vincite totali – joshnuss