dans mon Rails), je crée un tableau comme suit:
@messages.each do |message|
@list << {
:id => message.id,
:title => message.title,
:time_ago => message.replies.first.created_at
}
end
Après avoir fait ce tableau, j'aimerais le trier par ordre time_ago ASC, est-ce possible?
@list.sort_by{|e| e[:time_ago]}
la valeur par défaut est ASC, cependant si vous voulez DESC, vous pouvez faire:
@list.sort_by{|e| -e[:time_ago]}
En outre, il semble que vous essayez de construire la liste à partir de @messages
. Vous pouvez simplement faire:
@list = @messages.map{|m|
{:id => m.id, :title => m.title, :time_ago => m.replies.first.created_at }
}
Vous pourriez faire:
@list.sort {|a, b| a[:time_ago] <=> b[:time_ago]}
Dans Rails 4+
@list.sort_by(&:time_ago)
Vous pouvez aussi faire @list.sort_by { |message| message.time_ago }
Juste pour votre information, je ne vois pas l'intérêt de déplacer les messages dans une nouvelle liste, puis de les trier. À mon avis, tant qu'il s'agit d'ActiveRecord, cela devrait être fait directement lors de l'interrogation de la base de données.
Il semble que vous devriez pouvoir le faire comme ceci:
@messages = Message.includes(:replies).order("replies.created_at ASC")
Cela devrait suffire à moins que je ne comprenne mal le but.
Oui, vous pouvez utiliser group_by:
http://api.rubyonrails.org/classes/Enumerable.html#method-i-group_by