Chcę sortować według dwóch kolumn, jedna to DateTime ( updated_at
), a druga to Decimal (Price)
Chciałbym móc najpierw sortować według updated_at, a następnie, jeśli kilka pozycji występuje tego samego dnia, sortować według ceny.
ruby-on-rails
NullVoxPopuli
źródło
źródło
:order => ["DATE(#{table_name}.updated_at)", :price]
(zauważ, że:price
jest symbolem.)order
sposób:Model.all(:order => "day asc, `order` asc")
W Rails 4 możesz zrobić coś podobnego do:
Model.order(foo: :asc, bar: :desc)
foo
ibar
są kolumnami w bazie danych.źródło
Thing.find(:all, :order => "updated_at desc, price asc")
da rade.
Aktualizacja:
Thing.all.order("updated_at DESC, price ASC")
jest droga Rails 3. (Dzięki @cpursley )
źródło
Thing.all.order("updated_at DESC, price ASC")
Thing.order("LOWER(name), number")
.Interfejs kwerendy Active Record pozwala określić dowolną liczbę atrybutów w celu uporządkowania zapytania:
models = Model.order(:date, :hour, price: :desc)
lub jeśli chcesz uzyskać bardziej szczegółowe informacje (dzięki @ zw963 ):
models = Model.order(price: :desc, date: :desc, price: :asc)
Bonus: po pierwszym zapytaniu możesz łączyć inne zapytania:
models = models.where('date >= :date', date: Time.current.to_date)
źródło
model
na,models
aby ktoś wiedział, że jest w liczbie mnogiej. Tylko sugestia.:asc
zamiastasc
:Model.order({price: :desc}, {date: :desc}, {price: :asc})
Właściwie jest na to wiele sposobów przy użyciu modułu Active Record. Jeden, o którym nie wspomniano powyżej, to (w różnych formatach, wszystkie prawidłowe):
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
Może jest bardziej rozwlekły, ale osobiście łatwiej mi się nim zarządza. SQL jest tworzony tylko w jednym kroku:
SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC
Tak więc w przypadku pierwotnego pytania:
Model.order(:updated_at).order(:price)
Nie musisz deklarować typu danych, ActiveRecord robi to płynnie, podobnie jak twój silnik DB
źródło
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
? Kolejność klauzul kolejności w SQL jest odwrotna do tego, co otrzymuję, gdy.to_sql
na tym uruchamiam .Model.all(:order => 'updated_at, price')
źródło
Żaden z nich nie zadziałał dla mnie! Po dokładnie 2 dniach szukania w internecie od góry do dołu znalazłem rozwiązanie!
powiedzmy, że masz wiele kolumn w tabeli produktów, w tym: cena_specjalna i msrp. To są dwie kolumny, według których próbujemy sortować.
OK, najpierw w swoim Modelu dodaj tę linię:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }
Po drugie, w Kontrolerze produktu dodaj miejsce, w którym chcesz przeprowadzić wyszukiwanie:
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
źródło