2012-02-04 14 views
26

Por ejemplo, me gustaría ordenar por fecha_de_juego, y luego, si la fecha es la misma, ordenarla por equipo. Cuál sería la mejor forma de hacer esto?¿Cómo selecciono Ruby/Rails en dos campos?

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

Respuesta

76

La mejor manera sería tener su base de datos que no, pero si desea utilizar Ruby:

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

El comportamiento de ordenación de Array es para ordenar por el primer miembro, entonces el segundo, luego el tercero, y así sucesivamente. Como quiere que la fecha sea su clave principal y el equipo como el segundo, una selección de esos dos ordenará de la manera que desee.

+0

El problema es que un usuario tiene muchos equipos-y-un equipo tiene muchos juegos, así que no estoy seguro de cómo navegar hasta el nivel del juego, ¿así que no estoy seguro de cómo hacerlo en el nivel de DB? – Kamilski81

+4

¿Hay alguna manera de especificar la dirección para cada una de esas teclas también? – mehulkar

+0

@ daniel-pittman gracias! También puede ordenar por pocas teclas '@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 es una matriz o una relación. ¿Cómo tiene un método de "juegos"? – Swards

+0

Oye, gracias por esta respuesta, resolvió mi problema usando esto: @service_history = @ vehicle.services.order ("ASC cerrado, fecha_closed DESC") que trata sobre poner nils primero, luego desc fecha. – jared

+1

Creo que esto es mejor porque usará el orden SQL si es posible, que es más rápido que ordenar una matriz y funciona mejor con la paginación. ¿Derecha? – light24bulbs

2

Asumiendo que usted tiene un modelo que tiene estos dos campos

Model.all (: Para => 'atributo1, atributo2')

En caso que los campos están en varias tablas, se puede usar uniones.

0

Para aquellos que buscan ordenar una matriz que contiene dos objetos diferentes con un campo de fecha con un nombre diferente, puede hacerlo con un método de alias de atributo en el modelo.

note: using .sort_by! destructivamente no funciona.

News.rb

def release_date 
    self.publish_date 
end 

controlador

@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) 
Cuestiones relacionadas