2012-07-17 24 views
26

Tengo una variedad de membresías. En cada membresía es un grupo. Necesito ordenar esta matriz de membresías por el nombre del grupo. Lo he intentado de varias maneras, y la última es la siguiente:¿Cómo se ordena una matriz alfabéticamente utilizando sort_by en ruby?

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

Sin embargo, esto no ordena por su nombre. Parece estar ordenando al azar la matriz.

  • membresía belongs_to: Grupo
  • has_many Grupo: Miembros

@memberships es igual 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: Esto funciona -> @ memberships.sort_by! {| m | m.group.id}

Ordenará la matriz en función del group.id, por lo que tal vez tenga algo que ver con la ordenación alfabética.

Cualquier ayuda sería muy apreciada.

Respuesta

62

Vaya, después de luchar con esto durante un tiempo extremadamente largo, me di cuenta de que mi problema era simple. Estaba ordenando por group.name, pero algunos de los nombres de los grupos estaban en mayúsculas y algunos eran más bajos, lo que arrojaba todo. Convertir todo en downcase funcionó bien.

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

Concédete la respuesta cuando el sistema te lo permita. –

+0

Haré. Todavía tengo que esperar un día ... –

+0

Downcase es el camino a seguir +1 – earlonrails

3

¿Es el método de ordenación una opción?

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

Lo intenté también .. '@memberships.sort {| a, b | a.group.name <=> b.group.name} 'todavía no funciona tho. –

+0

Olvidé la anidación ... Corregí agregando la clave del grupo principal – Angelo

+0

Bien, tal vez este es el problema, algo que no mencioné. Cuando hago un.group.name estoy realizando una unión entre la tabla de membresías y grupos. Entonces, ¿eso tendría un efecto en la clasificación de resultados? Porque todavía no funcionará con el código actualizado. –

1

No veo cómo funciona su código. No puedo acceder a los hashes de las matrices usando m.group.name

Esto es una sintaxis de trabajo

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

ah, creo que debería revisar mi pregunta. cuando hago m.group estoy realizando un join sql –

+0

en cualquier caso, eso todavía no ordena correctamente por nombre. parece ser aleatorio (estoy seguro de que hay un método para su locura). –

Cuestiones relacionadas