Я хочу сортувати за двома стовпцями, один - 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").
Інтерфейс запиту активних записів дозволяє вказати стільки атрибутів, скільки потрібно для упорядкування запиту:
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 робить це гладко, як і ваш механізм DB
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' }
По-друге, у Контролері продукту додайте, де потрібно виконати пошук:
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
:order => ["DATE(#{table_name}.updated_at)", :price](Зверніть увагу, що:priceце символ.)