Ruby on Rails: как отсортировать два столбца с помощью ActiveRecord?
Я хочу отсортировать по двум столбцам, один из которых DateTime (updated_at), а другой-десятичный (цена)
Я хотел бы иметь возможность сортировать сначала по updated_at, а затем, если несколько элементов происходят в один и тот же день, Сортировать по цене.
7 ответов:
предполагая, что вы используете MySQL,
Model.all(:order => 'DATE(updated_at), price')обратите внимание, в отличие от других ответов. Элемент
updated_atстолбец будет полной меткой времени, так что если вы хотите сортировать на основе день он был обновлен, вы должны использовать функцию, чтобы получить только часть даты из метки времени. В MySQL, то естьDATE().
в Rails 4 Вы можете сделать что-то похожее на:
Model.order(foo: :asc, bar: :desc)
fooиbarстолбцов в БД.
Thing.find(:all, :order => "updated_at desc, price asc")будет делать трюк.
обновление:
Thing.all.order("updated_at DESC, price ASC")это текущий путь. (Спасибо @cpursley)
Интерфейс Запроса Активной Записи позволяет указать столько атрибутов, сколько вы хотите ордер ваш запрос:
models = Model.order(:date, :hour, price: :desc)или если вы хотите получить более конкретные (спасибо @zw963):
models = Model.order(price: :desc, date: :desc, price: :asc)бонус: после первого запроса вы можете связать другие запросы:
models = models.where('date >= :date', date: Time.current.to_date)
на самом деле есть много способов сделать это с помощью Active Record. Тот, который не был упомянут выше, будет (в различных форматах, все действительны):
Model.order(foo: :asc).order(:bar => :desc).order(:etc)может быть, это более многословно, но лично мне легче управлять. SQL создается только за один шаг:
SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASCтаким образом, для исходного вопроса:
Model.order(:updated_at).order(:price)вам не нужно объявлять тип данных, ActiveRecord делает это плавно, и так же делает ваш движок БД
ни один из них не работал для меня! После ровно 2 дней поиска сверху и снизу через интернет, я нашел решение!!
допустим, у вас есть много столбцов в таблице products, включая: special_price и msrp. Это два столбца, с которыми мы пытаемся разобраться.
хорошо, сначала в вашей модели добавьте эту строку:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }во-вторых, в контроллере продукта, добавьте, где необходимо выполнить поиска:
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
Comments