Как я могу отсортировать массив, возвращаемый запросом ActiveRecord столбцом даты created_at
?
Это происходит после выполнения запроса.
Пожалуйста, не говорите мне сделать это в запросе, потому что мне нужно, чтобы это произошло в представлении.
Как я могу отсортировать массив, возвращаемый запросом ActiveRecord столбцом даты created_at
?
Это происходит после выполнения запроса.
Пожалуйста, не говорите мне сделать это в запросе, потому что мне нужно, чтобы это произошло в представлении.
Ruby включает поддержку сортировки из коробки.
sorted = @records.sort_by &:created_at
Однако, похоже, это не имеет особого отношения к отображению и, вероятно, принадлежит контроллеру.
В то время как Ruby Enumerable является удивительным, запросы ActiveRecord фактически вернут ActiveRecord:: Relation, чей запрос еще не был оценен (Lazy Loading), и может иметь метод заказа вызвал его, чтобы отключить эту обработку в базе данных, где она будет масштабироваться намного лучше, чем стратегия Enumerable.
Использование Enumerable для сортировки также смешивает выполнение разбиения на страницы в базе данных. Нет ничего, чтобы предотвратить применение стратегии заказа в представлении. Тем не менее, я бы постарался включить это в модель на модель.
sorted = @records.order(:created_at)
Просто вызовите сортировку в коллекции, передав в блок кода, который сообщает Ruby, как вы хотите его сортировать:
collection.sort { |a,b| a.created_at <=> b.created_at }
Пожалуйста, замани его, а также проверить сложности.
Model.all.sort_by{|m| m.created_at} #=> O(log n)
#versus
Model.order("created_at DESC") #=> O(1)
Лучший способ сортировки массива ActiveRecord - использовать метод метода по умолчанию
@users.order(: created_at)
Это самое быстрое и самое правильное решение, потому что в этом случае он возвращает отсортированный массив из db, и вам не нужно использовать какую-либо другую операцию для этого в классе, например, если вы будете использовать предложенный sort_by
, он будет циклическим бросать каждый элемент массива, и после этого он не будет массивом ActiveRecord, а не круто, по моему мнению.
order
может использовать строки и sumbols, это очень полезно, и требуется несколько параметров
@users.order('created_at asc, first_name desc, last_name asc')