Rails, Ruby, comment trier un Tableau?
dans mon application rails, je suis en création d'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 ce tableau, j'aimerais ensuite les trier par time_ago de l'ASC de l'ordre, est-ce possible?
Vous devez vous connecter pour publier un commentaire.
la valeur par défaut de l'ASC, cependant, si vous voulais DESC que vous pouvez faire:
Aussi, il semble que vous essayez de créer la liste de
@messages
. Vous pouvez tout simplement faire:@list
. Donc@messages.each do |message| @list << { :id => message.id, :title => message.title, :time_ago => message.replies.first.created_at } end
@list.sort_by...
@list.sort_by{|e| e[:time_ago]}.reverse
mais que vraiment bizarre que cela ne fonctionne pas pour vous.@list.sort { |a, b| b[:time_ago] <=> a[:time_ago] }
si elle n'est pas aussi lisible.Time.now - message.replies.first.created_at
pour obtenir un numérique:time_ago
et puis l'inverse type de travail.Que vous pouvez faire:
@list.sort_by { |m| m[:time_ago] }
.Dans les rails 4+
Vous pouvez également faire
@list.sort_by { |message| message.time_ago }
{ |message| message.time_ago }
partie. Il est appelésort_by
car il trie par les critères du bloc. Ici, nous sommes en train de dire à trier par la.time_ago
membre de la éléments. Il trie toujours croissant. Pour trier par ordre décroissant, nous pouvons trier par ordre croissant par la négative de la valeur, comme décrit dans Mike Lewis réponse. 🙂 Si ça ne fonctionne pas, c'est parce que quel que soit le typetime_ago
a ne définit pas la négation. :/Juste pour info, je ne vois pas l'intérêt de déplacer les messages dans une nouvelle liste, puis de les trier. Tant qu'il est ActiveRecord il devrait être fait directement lors de l'interrogation de la base de données, à mon avis.
Il semble que vous devriez être en mesure de le faire comme ceci:
Qui devrait être suffisant, à moins que j'ai mal compris le but.
Oui, vous pouvez utiliser group_by :
http://api.rubyonrails.org/classes/Enumerable.html#method-i-group_by