如何获得0条评论的所有文章?

时间:2012-01-24 19:00:25

标签: ruby-on-rails-3 activerecord

文章有1条或多条评论。我怎么才能得到带有0条评论的文章?

使用计数器缓存会更容易。但是,我需要在不使用计数器缓存的情况下执行此操作。

2 个答案:

答案 0 :(得分:1)

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如何处理连接的子选择。

编辑:如果您只需要知道没有评论的文章,​​前一位评论者指出的solution会更容易。对于计数范围,以上将起作用。

答案 1 :(得分:0)

我对答案感兴趣。

您是否尝试使用示波器?

我不确定,但它可能是解决方案。

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