0

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

4

1 回答 1

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.nameGROUP BY列表中省略。

于 2012-05-14T18:58:24.747 回答