Подтвердить что ты не робот

Сортировка массива, возвращаемого ActiveRecord по дате (или любому другому столбцу)

Как я могу отсортировать массив, возвращаемый запросом ActiveRecord столбцом даты created_at?

Это происходит после выполнения запроса.

Пожалуйста, не говорите мне сделать это в запросе, потому что мне нужно, чтобы это произошло в представлении.

4b9b3361

Ответ 1

Ruby включает поддержку сортировки из коробки.

sorted = @records.sort_by &:created_at

Однако, похоже, это не имеет особого отношения к отображению и, вероятно, принадлежит контроллеру.

Ответ 2

В то время как Ruby Enumerable является удивительным, запросы ActiveRecord фактически вернут ActiveRecord:: Relation, чей запрос еще не был оценен (Lazy Loading), и может иметь метод заказа вызвал его, чтобы отключить эту обработку в базе данных, где она будет масштабироваться намного лучше, чем стратегия Enumerable.

Использование Enumerable для сортировки также смешивает выполнение разбиения на страницы в базе данных. Нет ничего, чтобы предотвратить применение стратегии заказа в представлении. Тем не менее, я бы постарался включить это в модель на модель.

sorted = @records.order(:created_at)

Ответ 3

Просто вызовите сортировку в коллекции, передав в блок кода, который сообщает Ruby, как вы хотите его сортировать:

collection.sort { |a,b| a.created_at <=> b.created_at }

Ответ 4

Пожалуйста, замани его, а также проверить сложности.

Model.all.sort_by{|m| m.created_at} #=> O(log n)

#versus

Model.order("created_at DESC") #=> O(1)

Ответ 5

Лучший способ сортировки массива ActiveRecord - использовать метод метода по умолчанию

@users.order(: created_at)

Это самое быстрое и самое правильное решение, потому что в этом случае он возвращает отсортированный массив из db, и вам не нужно использовать какую-либо другую операцию для этого в классе, например, если вы будете использовать предложенный sort_by, он будет циклическим бросать каждый элемент массива, и после этого он не будет массивом ActiveRecord, а не круто, по моему мнению.

order может использовать строки и sumbols, это очень полезно, и требуется несколько параметров

@users.order('created_at asc, first_name desc, last_name asc')