Ruby on Rails: как отсортировать по двум столбцам с помощью ActiveRecord? - PullRequest
77 голосов
/ 28 августа 2010

Я хочу отсортировать по двум столбцам, один - DateTime (updated_at), а другой - десятичный (цена)

Я бы хотел сначала отсортировать по updated_at, а затем, если в один и тот же день встречается несколько элементов, отсортировать по цене.

Ответы [ 7 ]

127 голосов
/ 18 октября 2013

В Rails 4 вы можете сделать что-то похожее на:

Model.order(foo: :asc, bar: :desc)

foo и bar столбцы в БД.

60 голосов
/ 28 августа 2010

Если вы используете MySQL,

Model.all(:order => 'DATE(updated_at), price')

Обратите внимание на отличие от других ответов.Столбец updated_at будет полной отметкой времени, поэтому, если вы хотите выполнить сортировку на основе обновления day , вам нужно использовать функцию, чтобы получить только часть даты из отметки времени.В MySQL это DATE().

53 голосов
/ 28 августа 2010
Thing.find(:all, :order => "updated_at desc, price asc")

сделает свое дело.

Обновление:

Thing.all.order("updated_at DESC, price ASC")

- это путь Rails 3. (Спасибо @ cpursley )

27 голосов
/ 12 июля 2013

Интерфейс запросов Active Record позволяет вам указать столько атрибутов, сколько вы хотите заказать ваш запрос:

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)
17 голосов
/ 12 января 2014

На самом деле есть много способов сделать это с помощью 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 делает это плавно, как и ваш DB Engine

2 голосов
/ 28 августа 2010
Model.all(:order => 'updated_at, price')
0 голосов
/ 11 августа 2016

Ничто из этого не сработало для меня! Спустя ровно 2 дня поиска в Интернете, я нашел решение !!

Допустим, у вас есть много столбцов в таблице продуктов, включая: 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...