45 votes

Comment trier en ruby/rails sur deux champs ?

Par exemple, je voudrais trier par game_date, puis si la date est la même, trier par équipe ? Quelle serait la meilleure façon de faire cela?

 @teams = @user.teams
@games = @teams.reduce([]) { |aggregate, team| aggregate + team.games}.sort_by(&:game_date)

118voto

Daniel Pittman Points 7394

Le meilleur moyen serait que votre base de données le fasse, mais si vous souhaitez utiliser Ruby :

 @games = @data.sort_by {|x| [x.game_date, x.team] }

Le comportement de tri de Array consiste à trier par le premier membre, puis le deuxième, puis le troisième, et ainsi de suite. Puisque vous voulez la date comme clé primaire et l'équipe comme seconde, un tableau de ces deux éléments triera comme vous le souhaitez.

26voto

demas Points 10567
@teams = @user.teams
@games = @teams.games.order("game_date ASC, team ASC")

7voto

Adrian Mann Points 2393
@teams = @user.teams 
@games = @teams.games.order(game_date: :asc, team: :asc)

1voto

Stone Points 1212

Pour ceux qui cherchent à trier un tableau contenant deux objets différents avec un champ de date nommé différemment, vous pouvez le faire avec une méthode d'alias d'attribut dans le modèle.

note : en utilisant .sort_by! de manière destructive ne fonctionne pas.

News.rb

 def release_date
    self.publish_date
end

Manette

 @grid_elements = @news + @albums
@grid_elements = @grid_elements.sort_by(&:release_date)

1voto

Wahaj Ali Points 1897

En supposant que vous ayez un modèle qui a ces deux champs

Model.all(:order => 'attribute1, attribute2')

Si les champs se trouvent dans plusieurs tables, vous pouvez utiliser des jointures.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X