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



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



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

443   7  

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 делает это плавно, и так же делает ваш движок БД

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

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

    Ничего не найдено.