Хотите отсортировать по количеству записей ассоциаций в Datamapper

Допустим, у меня есть следующие ресурсы DataMapper:

class Post
  include DataMapper::Resource 

  has n, :comments
  ...

end  

class Comment
  include DataMapper::Resource 

  belongs_to :post
  ...

end

Чтобы получить заказанный список постов, я знаю, что вы можете сделать:

@posts = Posts.all(:order => :date.desc)

Но допустим, я хочу отобразить все упорядоченные посты в порядке убывания по количеству комментариев. Как бы я это сделал?

3 ответа

Решение

Хороший способ сделать это по соображениям производительности - это кэшировать значение comment_count для поста, которое затем даст вам атрибут для использования:order, например, как:order =>:comment_count_cache.desc . Это легко настроить, добавив хук после создания для модели Comment.

Вы также можете использовать sort_by, который вызывает отдельный запрос:

@post = Post.all(:order => :date.desc).sort_by { |post| -post.comments.count }

Если вы хотите изменить порядок, вы можете убрать знак минус:

@post = Post.all(:order => :date.desc).sort_by { |post| post.comments.count }

Это хорошо синтаксически, но, как указывает adamaig, это, вероятно, будет работать хуже, чем кэширование количества комментариев в БД, потому что вы добавляете дополнительный SQL-запрос.

Я считаю, что SQL, который вы хотите создать, это:

SELECT posts.*, COUNT(comments.id) AS comments_count FROM posts
JOIN comments ON posts.id = comments.post_id
GROUP BY posts.id ORDER BY comments_count DESC

Насколько я знаю, это не то, что вы можете сделать программно с помощью класса Query. Просто зайдите в SQL для этого.

Другие вопросы по тегам