2010-10-20 14 views
32
<%= render :partial => 'event', :collection => @events.sort_by(&:event_at)%> 

Bu kod ASC olarak sipariş edilen bir koleksiyonu gösterir, ancak bu koleksiyonu DESC olarak sipariş etmek istiyorum.Koleksiyon olarak sipariş ver DESC

Bunu nasıl başarabilirim?

cevap

53

Daha da iyisi, etkinliğinizi sıralamak ve render'ınızda kullanmak için bir kapsam belirleyebilirsiniz. senin Olay modelinde

:

scope :desc, order("events.event_at DESC") 

Eğer raylar 3. kullanıyorsanız, görünümde sadece yapabilirsiniz:

<%= render @events.desc %> 
+0

Ben rayları kullanıyorum 2.3.5 :( –

+2

Sonra sorun değil, sadece benim örneğimi adapte: 'named_scope: desc,: order => (" olaylar .event_at DESC ")' ve '<% = render: kısmi => 'event',: collection => @ events.desc%>' – Yannis

+0

Bunu denediğimde bir hata karışıklığı yaşadım.de modellerde event.rb yazdım named_scope : desc,: order => ("events.event_at DESC") ve sonra <% = render: partial => 'event',: collection => @ events.desc%> ile çağırmayı denedim, ancak hata karmaşasını aldım : undefined method

4

Sahip olduğunuz nesne türüne bağlı olarak, sıralama işlevini gerçekleştirmenin farklı yollarına sahip olursunuz.

Nesneniz bir ActiveRecord ise, bunu şu şekilde yapabilirsiniz: Eğer veritabanından onları almak önce

@events.order('events.event_at DESC') 

Bu girdileri sıralama, SQL sorgusuna bir ORDER maddesini ekleyecektir.

Girdilerinizi Ruby'de sıraladığınız için ikinci çözüm daha yavaştır.
Ancak bir dizi nesneyi manipüle ediyorsanız, tek çözümünüzdür. <=> yöntemle yalnızca büyükleri bunların her birini kontrol

@events.sort {|a,b| b.event_at <=> a.event_at } 

tüm etkinlikler aracılığıyla bu şekilde döngü.

Ayrıca Enumerables'da the sort documentation'u da görebilirsiniz.

+0

Üzgünüz ama yakut ve raylar üzerinde yeni bir kullanıcıyım. Ne var, b ne anlama geliyor? Gerçek isimleri olan bir örnek yazabilir misin? Tercihen events_at –

+0

a ve b, dizinin iki öğesidir. İlkinden önce ikinci olanı istediğini belirtiyorsun. –

+0

Örneğiniz şöyle olmalıdır: <% = render: partial => 'event',: collection => @ events.sort {| a, b | b.event_at <=> a.event_at}%> – Yannis

8

sadece sıralı koleksiyon tersine çevirebilir:

<%= render :partial => 'event', :collection => @events.sort_by(&:event_at).reverse %> 

ama Yannis, veritabanından işleri iyi bir şekilde aldığınız için sıralamadan daha iyi olduğunu söylüyor. Raylar 3 doğru sözdizimi olarak

+0

Bu işe yaradı. Ama diğer örnekleri öğrenmeye çalışmak istiyorum. –

10

geçerli:

<%= render :partial => 'event', :collection => @events.order(:event_at).reverse_order %> 
1

Bunu yapabilirsin üzerinde tanımladı.

Bu event_at alanın azalan sırada size @ olayları verecek örnek

@events.desc(:event_at) 

aşağıya bakınız.

Teşekkürler.