web-dev-qa-db-fra.com

Rails, Ruby, comment trier un tableau?

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?

62
AnApprentice
 @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 }
}
133
Mike Lewis

Vous pourriez faire:

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

Dans Rails 4+

@list.sort_by(&:time_ago)
8
Eric Norcross

Vous pouvez aussi faire @list.sort_by { |message| message.time_ago }

5
Dylan Markow

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.

4
DanneManne
1
Spyros