导轨通过模型对嵌套的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
。
感谢您的回答,但我也需要查询来省略投票数超过一个月的投票 –
在实际的表结构中再次猜测,我添加了一行限制上个月的投票。 – kgrittn
非常棒!谢谢。我还有一个问题。我使用的是Postgre 9.0,我想从视频表中选择所有列而不是名称和ID,因此我将第一行更改为'SELECT *,count(*)作为vote_count',但随后它一直给我有关GROUP BY行的错误。我是否需要将视频表中的每一列添加到此行,还是有更好的方法来做到这一点? –