2011-04-21 26 views
57

en mi aplicación rieles estoy creando una matriz de este modo:Rails, Ruby, cómo ordenar una matriz?

@messages.each do |message| 

    @list << { 
    :id => message.id, 
    :title => message.title, 
    :time_ago => message.replies.first.created_at 
    } 
end 

Después de hacer esta serie me gustaría a continuación, ordenar por orden ASC TIME_AGO, es posible?

Respuesta

119
@list.sort_by{|e| e[:time_ago]} 

el valor predeterminado es ASC, sin embargo, si Querías DESC que puedes hacer:

@list.sort_by{|e| -e[:time_ago]} 

También parece que está intentando compilar la lista desde @messages. Simplemente puede hacer:

@list = @messages.map{|m| 
    {:id => m.id, :title => m.title, :time_ago => m.replies.first.created_at } 
} 
+0

Entonces, ¿hago esto antes de crear @list? ¿o? Lo probé después y se produce un error con: NoMethodError (método indefinido 'time_ago 'para # ): – AnApprentice

+1

Lo hace después de compilar' @ list'. Entonces '@messages.each do | message | @List << { : id => Message.Id, : title => message.title, : TIME_AGO => message.replies.first.created_at } end' '@ list.sort_by. ..' –

+3

Para DESC, intenté que obtuviera el método indefinido '- @ 'para el miércoles 20 de abril 20:40:35 UTC 2011: hora – AnApprentice

10

que podría hacer:

@list.sort {|a, b| a[:time_ago] <=> b[:time_ago]} 
+2

Mejor aún, '@list.sort_by {| m | m [: time_ago]} '. –

5

También se puede hacer @list.sort_by { |message| message.time_ago }

+0

Gracias, pero ¿cómo se define el orden de clasificación? – AnApprentice

+0

Define el orden de clasificación con el '{| mensaje | message.time_ago} 'part. Se llama 'sort_by' porque se ordena según los criterios del bloque. Aquí, estamos ordenando por el miembro '.time_ago' de los elementos. Siempre ordena de forma ascendente. Para clasificar descendentemente, podemos clasificar ascendente por el valor negativo de ese valor, como se describe en la respuesta de Mike Lewis. :) Si no funciona, es porque cualquier tipo 'time_ago' no define negación. :/ –

3

Para su información, no veo el punto en el movimiento de los mensajes en una nueva lista y luego ordenarlos. Siempre que sea ActiveRecord, debería hacerse directamente al consultar la base de datos en mi opinión.

Parece que debería ser capaz de hacerlo de esta manera:

@messages = Message.includes(:replies).order("replies.created_at ASC") 

Eso debería ser suficiente a menos que haya entendido mal el propósito.

3

En los carriles 4+

@list.sort_by(&:time_ago) 
Cuestiones relacionadas