2012-02-04 18 views
26

Per esempio, mi piacerebbe ordinare per game_date, e poi se la data è la stessa, ordinarla per squadra? Quale sarebbe il modo migliore per farlo?Come si ordina in ruby ​​/ rails su due campi?

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

risposta

76

Il modo migliore sarebbe quella di avere il database farlo, ma se si desidera utilizzare Rubino:

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

Il comportamento di ordinamento di Array è quello di ordinare dal primo elemento, poi il secondo, poi il terzo e così via. Dal momento che si desidera che la data sia la chiave primaria e la squadra come seconda, una matrice di questi due si ordinerà nel modo desiderato.

+0

Il problema è che un utente ha-molte squadre e una squadra ha-molti giochi, quindi non sono sicuro come navigare fino al livello di gioco, quindi non sono sicuro di come farlo a livello db? – Kamilski81

+4

C'è un modo per specificare anche la direzione per ciascuno di questi tasti? – mehulkar

+0

@ daniel-pittman grazie! Inoltre puoi ordinare per pochi tasti '@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 è un array o una relazione. Come ha un metodo "giochi"? – Swards

+0

Hey, grazie per questa risposta, ha risolto il mio problema usando questo: @service_history = @ vehicle.services.order ("ASC chiuso, data_closed DESC") che trattava prima di mettere i nils, poi la data di desc. – jared

+1

Penso che sia meglio perché userà l'ordine SQL, se possibile, che è più veloce dell'ordinamento di un array e funziona meglio con l'impaginazione. Destra? – light24bulbs

2

Supponendo di avere un modello che hanno questi due campi

Model.all (: order => 'attributo1, attributo2')

Incase i campi sono in più tabelle, è possibile usa join.

0

Per coloro che desiderano ordinare un array contenente due oggetti diversi con un campo data con nome diverso, è possibile farlo con un metodo alias dell'attributo nel modello.

nota: utilizzando .sort_by! distruttivamente non funziona.

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)