Я хочу сортировать по двум столбцам, один - DateTime (updated_at
), а другой - Decimal (Price)
Я хотел бы иметь возможность сортировать сначала по update_at, тогда, если в тот же день происходит несколько элементов, сортируйте по цене.
Я хочу сортировать по двум столбцам, один - DateTime (updated_at
), а другой - Decimal (Price)
Я хотел бы иметь возможность сортировать сначала по update_at, тогда, если в тот же день происходит несколько элементов, сортируйте по цене.
Предполагая, что вы используете MySQL,
Model.all(:order => 'DATE(updated_at), price')
Обратите внимание на отличие от других ответов. Столбец updated_at
будет представлять собой полную метку времени, поэтому, если вы хотите сортировать на основе дня, она была обновлена, вам нужно использовать функцию, чтобы получить только часть даты из метки времени. В MySQL это DATE()
.
В Rails 4 вы можете сделать что-то похожее на:
Model.order(foo: :asc, bar: :desc)
foo
и bar
являются столбцами в db.
Thing.find(:all, :order => "updated_at desc, price asc")
сделает трюк.
Thing.all.order("updated_at DESC, price ASC")
- текущий путь. (Спасибо @cpursley)
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)
На самом деле существует много способов сделать это с помощью 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
Model.all(:order => 'updated_at, price')
Никто из них не работал у меня! После ровно 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)