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

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


person michael_erasmus    schedule 30.09.2009    source источник


Ответы (3)


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

person adamaig    schedule 01.11.2009

В качестве альтернативы вы можете использовать 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 }

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

person Armin    schedule 26.04.2011

Я считаю, что 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 для этого.

person Bob Aman    schedule 24.10.2009