2012-05-14 2 views
0

Моего упрощена рельсы приложения выглядит следующим образомрельсы 3.1 сложного find_by_sql запроса на вложенной has_many через модель

# 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

Я ничего о рельсах не знаю, но угадывая таблицы структур от того, что в этом вопросе, я думаю, 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.

+0

Спасибо за ответ, но мне также нужен запрос опускать голоса, которые старше одного месяца из подсчета голосов –

+0

Угадывая (снова) в фактической структуре таблицы, я добавил строку, чтобы ограничить голоса за последний месяц , – kgrittn

+0

отлично поработал! Спасибо. У меня есть еще один вопрос. Я использую postgre 9.0, и я хочу выбрать все столбцы из таблицы видео, а не только имя и идентификатор, поэтому я изменил первую строку на 'SELECT *, count (*) как vote_count', но затем он продолжал давать мне ошибки в строке GROUP BY. Нужно ли добавлять каждый столбец из таблицы видео в эту строку или есть лучший способ сделать это? –

Смежные вопросы