我的简化rails应用程序看起来像这样
# 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。非常感谢任何帮助。
答案 0 :(得分:1)
我对rails没有任何了解,但是从问题中的内容猜测表格结构,我认为以下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或更高版本,则可以从video.name
列表中省略GROUP BY
。