Я ударил небольшой блок с помощью новых методов scope
(Arel 0.4.0, Rails 3.0.0.rc)
В основном я:
A topics
, модель has_many :comments
и a 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 репрессий в надежде скоро прийти к элегантному решению.