Как мне отсортировать в ruby ​​/ rails на двух полях? - PullRequest
35 голосов
/ 04 февраля 2012

Например, я бы хотел отсортировать по game_date, а затем, если дата совпадает, отсортировать по команде? Каков наилучший способ сделать это?

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

Ответы [ 5 ]

98 голосов
/ 04 февраля 2012

Лучшим способом было бы сделать так, чтобы ваша база данных делала это, но если вы хотите использовать Ruby:

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

Сортировка Array заключается в сортировке по первому члену, а затем по второму.потом третий и тд.Поскольку вы хотите, чтобы дата была вашим основным ключом, а команда - вторым, массив этих двух элементов будет отсортирован так, как вы хотите.

25 голосов
/ 04 февраля 2012
@teams = @user.teams
@games = @teams.games.order("game_date ASC, team ASC")
4 голосов
/ 13 июля 2015
@teams = @user.teams 
@games = @teams.games.order(game_date: :asc, team: :asc)
2 голосов
/ 04 февраля 2012

Предполагая, что у вас есть модель с этими двумя полями

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

Если поля находятся в нескольких таблицах, вы можете использовать объединения.

0 голосов
/ 18 января 2014

Для тех, кто хочет отсортировать массив, содержащий два разных объекта с различным полем даты, вы можете сделать это с помощью метода псевдонима атрибута в модели.

note : использование .sort_by!разрушительно не работает.

News.rb

def release_date
    self.publish_date
end

Контроллер

@grid_elements = @news + @albums
@grid_elements = @grid_elements.sort_by(&:release_date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...