Как получить все статьи с 0 комментариями? - PullRequest
1 голос
/ 24 января 2012

Статья имеет 1 или много комментариев. Как бы получить только статьи с 0 комментариями?

Это было бы проще с счетчиком кэша. Однако мне нужно сделать это без использования счетчика кэша.

Ответы [ 2 ]

1 голос
/ 25 января 2012
class Article < ActiveRecord::Base
  has_many :comments

  scope :without_comments,
         joins(<<-SQL
               LEFT OUTER JOIN
                 (SELECT article_id
                  FROM comments GROUP BY article_id) AS rolled_up_comments
               ON comments.article_id = articles.id
         SQL
         ).
         where("rolled_up_comments.article_id" => nil)
end

Используйте вот так:

Article.without_comments.all

Это может быть легко адаптировано для возврата статей с определенным количеством или диапазоном комментариев, например ::

class Article < ActiveRecord::Base
  has_many :comments

  scope :with_comment_count,
         joins(<<-SQL
               LEFT OUTER JOIN
                 (SELECT article_id, COUNT(*) AS comment_count
                  FROM comments GROUP BY article_id) AS rolled_up_comments
               ON comments.article_id = articles.id
         SQL
         )
  scope :with_n_comments, lambda {
           with_comment_count.
           where(:"rolled_up_comments.comment_count" => n)
         }
end 

В последнем случае n может быть определенным числом, таким как 100, или диапазоном, таким как 1..10, который ActiveRecord превратит в BETWEEN запрос, возвращающий статьи с комментариями от 1 до 10.

Обратите внимание, что в случае с 0 комментариями счетчик равен NULL, поэтому вы не можете использовать запрос диапазона для этого.

Я проверял это в Postgres. Я не знаю, будет ли это работать в MySQL. Я не уверен, как / если MySQL обрабатывает подвыборы для объединений.

Редактировать: Решение , указанное предыдущим комментатором, проще, если вам нужно знать только статьи без комментариев. Для диапазонов подсчета будет работать вышеуказанное.

0 голосов
/ 25 января 2012

меня интересует ответ.

Вы пробовали с прицелом?

Я не уверен, но это может быть решением.

Rails doc: http://guides.rubyonrails.org/active_record_querying.html#scopes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...