я ударил небольшой блок с новыми scope
методами (Arel 0.4.0, Rails 3.0.0.rc)Rails Арел выбора различных столбцов
В принципе у меня есть:
topics
А модель, которая has_many :comments
и модель comments
(с колонкой topic_id
), которая belongs_to :topics
.
Я пытаюсь найти коллекцию «Горячие темы», то есть темы, которые были недавно прокомментированы. Текущий код выглядит следующим образом:
# models/comment.rb
scope :recent, order("comments.created_at DESC")
# models/topic.rb
scope :hot, joins(:comments) & Comment.recent & limit(5)
Если я выполнить Topic.hot.to_sql
следующий запрос обжигают:
SELECT "topics".* FROM "topics" INNER JOIN "comments"
ON "comments"."topic_id" = "topics"."id"
ORDER BY comments.created_at DESC LIMIT 5
Это прекрасно работает, но потенциально возвращает повторяющиеся темы - Если тема # 3 недавно прокомментировал несколько раз, он будет возвращен несколько раз.
Мой вопрос
Как бы идти о возвращении определенный набор тем, имея в виду, что я все еще нужно, чтобы получить доступ к comments.created_at
поле, чтобы показать, как давно последний пост был? Я бы представлял себе что-то вроде линий distinct
или group_by
, но я не слишком уверен, как лучше всего это сделать.
Любые советы/предложения очень ценятся - я добавил 100-страничную награду в надежде скоро прийти к элегантному решению.
Спасибо за ваш ответ - это решение, но я действительно ищу только тот, который использует Rails3/Arel 'scope'! – Jeriko
Обновлен мой ответ, посмотрите. –
Я принимаю этот ответ и награждаю вас щедростью. Это не отвечает на мой первоначальный вопрос, но в любом случае он работает лучше. Спасибо :) – Jeriko