İki sütuna göre sıralamak istiyorum, biri DateTime ( updated_at
) ve diğeri Decimal (Fiyat)
Önce updated_at'a göre sıralayabilmek, ardından aynı gün birden fazla öğe ortaya çıkarsa, Fiyata göre sıralayabilmek istiyorum.
İki sütuna göre sıralamak istiyorum, biri DateTime ( updated_at
) ve diğeri Decimal (Fiyat)
Önce updated_at'a göre sıralayabilmek, ardından aynı gün birden fazla öğe ortaya çıkarsa, Fiyata göre sıralayabilmek istiyorum.
Yanıtlar:
MySQL kullandığınızı varsayarsak,
Model.all(:order => 'DATE(updated_at), price')
Diğer cevaplardan ayrıma dikkat edin. updated_at
Sütun sıralama dayalı istiyorum eğer öyleyse, tam bir zaman damgası olacaktır gün o güncellendi, sen damgası sadece tarih bölümünü almak için bir işlevi kullanmak gerekir. MySQL'de yani DATE()
.
order
: gibi pekModel.all(:order => "day asc, `order` asc")
Rails 4'te aşağıdakilere benzer bir şey yapabilirsiniz:
Model.order(foo: :asc, bar: :desc)
foo
ve bar
db'deki sütunlardır.
Thing.find(:all, :order => "updated_at desc, price asc")
hile yapacak.
Thing.all.order("updated_at DESC, price ASC")
Rails 3 yoludur. (Teşekkürler @cpursley )
Thing.all.order("updated_at DESC, price ASC")
Thing.order("LOWER(name), number")
.
Aktif Kayıt Sorgu Arayüzü , sorgunuzu sıralamak istediğiniz kadar öznitelik belirtmenize izin verir :
models = Model.order(:date, :hour, price: :desc)
veya daha spesifik olmak istiyorsanız (teşekkürler @ zw963 ):
models = Model.order(price: :desc, date: :desc, price: :asc)
Bonus: İlk sorgudan sonra, diğer sorguları zincirleyebilirsiniz:
models = models.where('date >= :date', date: Time.current.to_date)
model
, models
böylece bir kişi çoğul olduğunu bilsin. Sadece bir öneri.
:asc
yerine şu şekilde olmalıdır asc
:Model.order({price: :desc}, {date: :desc}, {price: :asc})
Aslında bunu Active Record kullanarak yapmanın birçok yolu vardır. Yukarıda bahsedilmeyen bir tanesi (çeşitli formatlarda, tümü geçerli) olacaktır:
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
Belki daha ayrıntılı, ama kişisel olarak yönetmeyi daha kolay buluyorum. SQL yalnızca tek adımda üretilir:
SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC
Dolayısıyla, orijinal soru için:
Model.order(:updated_at).order(:price)
Veri türünü bildirmenize gerek yoktur, ActiveRecord bunu sorunsuz bir şekilde yapar ve DB Motorunuz
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
mu? SQL'deki sipariş cümlelerinin sırası, bunun .to_sql
üzerinde çalıştırdığım zaman aldığımın tam tersi .
Bunların hiçbiri benim için işe yaramadı! İnternette tam olarak 2 gün aşağıya baktıktan sonra bir çözüm buldum !!
Diyelim ki ürünler tablosunda özel_fiyat ve msrp dahil birçok sütununuz var. Bunlar, sıralamaya çalıştığımız iki sütun.
Tamam, İlk olarak Modelinize şu satırı ekleyin:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }
İkinci olarak, Ürün Denetleyicisinde, aramayı yapmanız gereken yeri ekleyin:
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
:order => ["DATE(#{table_name}.updated_at)", :price]
(Not:price
bir semboldür.)