2012-02-04 24 views
26

Na przykład, chciałbym sortować według game_date, a następnie, jeśli data jest taka sama, posortować według zespołu? Jaki byłby najlepszy sposób na zrobienie tego?Jak sortować ruby ​​/ szyny na dwóch polach?

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

Odpowiedz

76

Najlepszym sposobem byłoby mieć swoją bazę danych na temat tego, ale jeśli chcesz użyć Ruby

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

sortowania zachowanie Array jest, aby posortować według pierwszego członu, wówczas po drugie, potem trzeci i tak dalej. Ponieważ chcesz, aby data była twoim kluczem podstawowym, a zespół drugim, wszystkie te elementy będą sortowane tak, jak chcesz.

+0

Problem polega na tym, że użytkownik ma-wiele zespołów i zespół ma-wiele gier, więc nie jestem pewien, jak się poruszać do poziomu gry, więc nie jestem pewien, jak to zrobić na poziomie db? – Kamilski81

+4

Czy istnieje sposób określenia kierunku również dla każdego z tych klawiszy? – mehulkar

+0

@ daniel-pittman dzięki! Możesz również sortować według kilku klawiszy '@games = @ data.sort_by {| x, y | [x.game_date, y.name]} ' –

22
@teams = @user.teams 
@games = @teams.games.order("game_date ASC, team ASC") 
+0

@teams to tablica lub relacja. Jak działa metoda "gier"? – Swards

+0

Hej dziękuję za tę odpowiedź, to rozwiązało mój problem, używając: @service_history = @ vehicle.services.order ("closed ASC, date_closed DESC"), który zajmował się umieszczaniem nils najpierw, a następnie datą. – jared

+1

Myślę, że jest to lepsze, ponieważ będzie używał polecenia SQL, jeśli jest to możliwe, co jest szybsze niż sortowanie tablicy i działa lepiej z paginacją. Dobrze? – light24bulbs

2

Zakładając, że masz model, które mają te dwa pola

Model.all (: order => 'atrybut1, atrybut2')

Okrywać pola są w wielu tabel, można użyj złączeń.

0

Dla tych, którzy chcą posortować tablicę zawierającą dwa różne obiekty w/o inaczej nazwanym polu daty, można to zrobić za pomocą metody aliasu atrybutów w modelu.

uwaga: za pomocą .sort_by! destruktywnie nie działa.

News.rb

def release_date 
    self.publish_date 
end 

Controller

@grid_elements = @news + @albums 
@grid_elements = @grid_elements.sort_by(&:release_date) 
4
@teams = @user.teams 
@games = @teams.games.order(game_date: :asc, team: :asc) 
Powiązane problemy