文章有1条或多条评论。我怎么才能得到带有0条评论的文章?
使用计数器缓存会更容易。但是,我需要在不使用计数器缓存的情况下执行此操作。
答案 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