2012-07-17 35 views
26

Ho una matrice di appartenenze. In ogni appartenenza è un gruppo. Ho bisogno di ordinare questa matrice di appartenenze in base al nome del gruppo. Ho provato un sacco di modi diversi, e il modo più recente è questo:Come si ordina una matrice alfabeticamente usando sort_by in ruby?

@memberships.sort_by! { |m| m.group.name } 

Tuttavia, questo non ordina il nome. Sembra che stia ordinando casualmente la matrice.

  • appartenenza belongs_to: Gruppo
  • Gruppo has_many: Appartenenze

@memberships è pari a:

[ 
    { 
    id: 2141, 
    user_id: 491, 
    group_id: 271, 
    member_type: "member", 
    group: { 
     id: 271, 
     name: "Derek's", 
     privacy: "open", 
     bio_image_url: "/bio_images/medium/missing.png?1340285189", 
     member_count: 1, 
     upcoming_checkins_count: 0 
    } 
    }, 
    { 
    id: 2201, 
    user_id: 221, 
    group_id: 291, 
    member_type: "member", 
    group: { 
     id: 291, 
     name: "Rounded Developement", 
     privacy: "closed", 
     bio_image_url: "/groups/medium/291/bioimage.jpg?1340736175", 
     member_count: 7, 
     upcoming_checkins_count: 0 
    } 
} 
] 

NOTA: Questo funziona -> @ memberships.sort_by! {| m | m.group.id}

Ordinerà l'array basato su group.id, quindi forse ha qualcosa a che fare con l'ordinamento alfabeticamente?

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

62

Wow, dopo aver lottato con questo per un tempo estremamente lungo, ho realizzato il mio problema era semplice. Stavo ordinando per group.name ma alcuni dei nomi dei gruppi erano maiuscoli e alcuni erano più bassi, il che stava buttando via tutto. La conversione di tutto in un downcase ha funzionato bene.

@memberships.sort_by!{ |m| m.group.name.downcase } 
+1

Concediti la risposta quando il sistema ti lascerà. –

+0

Lo farà. Devo ancora aspettare un giorno ... –

+0

Downcase è la strada da percorrere +1 – earlonrails

3

Il metodo di ordinamento è un'opzione?

ary.sort{ |a,b| a[:group][:name] <=> b[:group][:name] } 
+0

Ho provato anche questo .. '@memberships.sort {| a, b | a.group.name <=> b.group.name} 'ancora non funziona tho. –

+0

Ho dimenticato il nidificazione ... Ho corretto aggiungendo la chiave del gruppo genitore – Angelo

+0

Ok, forse questo è il problema, qualcosa che non ho menzionato. Quando eseguo a.group.name, eseguo un join tra la tabella dei membri e dei gruppi. Quindi, ciò avrebbe un effetto sull'ordinamento dei risultati? Perché ancora non funzionerà con il codice aggiornato. –

1

Non vedo come funziona il codice. Non riesco ad accedere gli hash delle matrici usando m.group.name

Ecco una sintassi di lavoro

@memberships.sort_by!{ |m| m[:group][:name] } 
+0

ah, penso che dovrei rivedere la mia domanda. quando eseguo m.group eseguo un sql join –

+0

in ogni caso, che ancora non ordina correttamente per nome. sembra essere casuale (sono sicuro che esista un metodo per la sua pazzia). –