rails 3.1复杂的find_by_sql查询嵌套的has_many到模型

时间:2012-05-14 03:05:17

标签: postgresql ruby-on-rails-3.1 nested has-many-through

我的简化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。非常感谢任何帮助。

1 个答案:

答案 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