Я хочу отсортировать по двум столбцам: один - DateTime ( updated_at), а другой - десятичный (цена)
Я хотел бы иметь возможность сначала сортировать по updated_at, а затем, если в один день появляется несколько элементов, сортировать по цене.
Я хочу отсортировать по двум столбцам: один - DateTime ( updated_at), а другой - десятичный (цена)
Я хотел бы иметь возможность сначала сортировать по updated_at, а затем, если в один день появляется несколько элементов, сортировать по цене.
Ответы:
Предполагая, что вы используете MySQL,
Model.all(:order => 'DATE(updated_at), price')
Обратите внимание на отличие от других ответов. updated_atКолонка будет полная метка времени, так что если вы хотите сортировать на основе день она была обновлена, вам нужно использовать функцию , чтобы получить только часть даты с отметки времени. В MySQL это так DATE().
orderвот так:Model.all(:order => "day asc, `order` asc")
В 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")
это путь Rails 3. (Спасибо @cpursley )
Thing.all.order("updated_at DESC, price ASC")
Thing.order("LOWER(name), number").
Интерфейс запросов 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)
modelна, modelsчтобы человек знал, что это множественное число. Просто предложение.
:ascвместо asc:Model.order({price: :desc}, {date: :desc}, {price: :asc})
На самом деле есть много способов сделать это с помощью 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.order(foo: :asc).order(:bar => :desc).order(:etc)? Порядок предложений порядка в SQL противоположен тому, что я получаю, когда запускаю его .to_sql.
Ни один из них не помог мне! Ровно через 2 дня поисков в Интернете я нашел решение !!
Допустим, у вас есть много столбцов в таблице продуктов, включая special_price и msrp. Это два столбца, по которым мы пытаемся выполнить сортировку.
Хорошо, сначала в вашей модели добавьте эту строку:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }
Во-вторых, в Product Controller добавьте, где вам нужно выполнить поиск:
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
:order => ["DATE(#{table_name}.updated_at)", :price](Обратите внимание, что:priceэто символ.)