Ruby on Rails: как мне сортировать два столбца с помощью ActiveRecord?

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

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

Ответ 1

Предполагая, что вы используете MySQL,

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

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

Ответ 2

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

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

foo и bar являются столбцами в db.

Ответ 3

Thing.find(:all, :order => "updated_at desc, price asc")

сделает трюк.

Обновление:

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

- текущий путь. (Спасибо @cpursley)

Ответ 4

Active Record Query Interface позволяет указать столько атрибутов, сколько хотите order ваш запрос:

models = Model.order(:date, :hour, price: :desc)

или если вы хотите получить более конкретную информацию (спасибо @zw963):

models = Model.order({price: :desc}, {date: :desc}, {price: asc}) 

Бонус: после первого запроса вы можете связать другие запросы:

models = models.where("date >= ?", Time.current.to_date)

Ответ 5

На самом деле существует много способов сделать это с помощью 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

Ответ 6

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

Ответ 7

Никто из них не работал у меня! После ровно 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)