2012-05-14 171 views
0

我簡化Rails應用程序看起來像這樣導軌通過模型對嵌套的has_many 3.1複雜的find_by_sql查詢

# chapter.rb 
has_many :sections 
has_many :videos, through: :sections 

# section.rb 
belongs_to :chapter 
has_many :videos 

# video.rb 
belongs_to :section 
has_many :votes 

# vote.rb 
belongs_to :video 

我想要做的就是找到頂級的5當前熱門影片對於給定章,這意味着通過它在上個月內收到的票數排序視頻(顯然,限制爲5個結果)。

我想在我的章節模型中編寫popular_videos方法,我認爲這需要find_by_sql查詢,對吧?但是我不知道寫足夠的sql來寫這個查詢。

投票表有一個created_at列,我使用postgres作爲我的數據庫。任何幫助是極大的讚賞。

回答

1

我不知道鐵軌什麼,但是從什麼的問題表結構猜測,我認爲SQL像下面的是一個方法,提供你想要的東西:

SELECT video.id, video.name, count(*) as vote_count 
    FROM video JOIN vote ON (video.id = vote.video_id) 
    WHERE vote.date > (current_date - interval '1 month') 
    GROUP BY video.id, video.name 
    ORDER BY vote_count DESC 
    LIMIT 5; 

如果您正在運行PostgreSQL 9.1或更高版本,您可能會從GROUP BY列表中忽略video.name

+0

感謝您的回答,但我也需要查詢來省略投票數超過一個月的投票 –

+0

在實際的表結構中再次猜測,我添加了一行限制上個月的投票。 – kgrittn

+0

非常棒!謝謝。我還有一個問題。我使用的是Postgre 9.0,我想從視頻表中選擇所有列而不是名稱和ID,因此我將第一行更改爲'SELECT *,count(*)作爲vote_count',但隨後它一直給我有關GROUP BY行的錯誤。我是否需要將視頻表中的每一列添加到此行,還是有更好的方法來做到這一點? –