2011-05-22 33 views
5

İki modelim var: User, ve user_id sütun (yabancı anahtar) ve created_at sütununa sahip Post.Kullanıcıları en son gönderime göre nasıl sıralayabilirim?

Kullanıcıları en son gönderiye göre sıralamak isterim. Örneğin, eğer:

user_id = 1, created 3 posts at: 17/05/2011, 19/05/2011, 21/05/2011 
user_id = 2, created 1 post at: 22/05/2011 
user_id = 3, created 2 posts at: 18/05/2011, 20/05/2011 

sonucu olmalıdır:

user_id = 2 
user_id = 1 
user_id = 3 

Nasıl bu Rails 3 başarmak ki?

cevap

1

gibi bir şey olmalı

Post.select(:user_id).group(:user_id).order("MAX(id) DESC") 

Bu şekilde: Eğer büyük id ile bir satır son olmasından güvenebilirsiniz Mevcut birincil anahtar dizini id sütununda kullanabilirsiniz (ve created_at sütununa yeni bir dizin eklemekten kaçınmak).

+1

Bu yanlış. Örneğin, 3 kullanıcı varsa ve her kullanıcı bir gönderi varsa, 'User.joins (: mesajlar) .size' 3 yerine 10, –

+0

haklısınız, üzgünüm, daha iyi bir şey arıyor;) – apneadiving

+0

Bu neredeyse doğru. Bunu "sipariş (" max (created_at) DESC ") olarak değiştirdikten sonra, Denis'in önerdiği gibi, hile yapar gibi görünüyor. Yine de, "max" olmadan ne tür bir sıralama yapıldığı konusunda emin değilim ... –

2

RoR kısımdan emin değil, ancak ifade tarafından bir gruba aradığınız:

Post.select(:user_id).group(:user_id).order("created_at DESC") 
1

son mesaja göre sıralamak isterseniz:

select user_id, max(created_at) as created_at 
from posts 
group by user_id 
order by max(created_at) desc 
İlgili konular