导轨通过模型对嵌套的has_many 3.1复杂的find_by_sql查询

问题描述:

我简化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作为我的数据库。任何帮助是极大的赞赏。

我不知道铁轨什么,但是从什么的问题表结构猜测,我认为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行的错误。我是否需要将视频表中的每一列添加到此行,还是有更好的方法来做到这一点? –