Хотите отсортировать по количеству записей ассоциаций в 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 для этого.