Как сортировать в ruby /rails на двух полях?
Например, я хотел бы сортировать по game_date, а затем, если дата такая же, сортируйте ее по команде? Какой был бы лучший способ сделать это?
@teams = @user.teams
@games = @teams.reduce([]) { |aggregate, team| aggregate + team.games}.sort_by(&:game_date)
Ответы
Ответ 1
Лучшим способом было бы сделать вашу базу данных, но если вы хотите использовать Ruby:
@games = @data.sort_by {|x| [x.game_date, x.team] }
Поведение сортировки Array
заключается в сортировке по первому члену, затем по второму, затем по третьему и т.д. Поскольку вы хотите, чтобы дата была как ваш первичный ключ, а команда - второй, массив из этих двух будет сортироваться так, как вы хотите.
Ответ 2
@teams = @user.teams
@games = @teams.games.order("game_date ASC, team ASC")
Ответ 3
@teams = @user.teams
@games = @teams.games.order(game_date: :asc, team: :asc)
Ответ 4
Предполагая, что у вас есть модель, у которой есть эти два поля
Model.all(: order = > 'attribute1, attribute2')
Если поля находятся в нескольких таблицах, вы можете использовать объединения.
Ответ 5
Для тех, кто хочет отсортировать массив, содержащий два разных объекта с иначе названным полем даты, вы можете сделать это с помощью метода псевдонимов атрибута в модели.
note: используя .sort_by! деструктивно не работает.
News.rb
def release_date
self.publish_date
end
Controller
@grid_elements = @news + @albums
@grid_elements = @grid_elements.sort_by(&:release_date)