计算评论者的数量

时间:2015-02-05 19:13:58

标签: ruby-on-rails ruby-on-rails-4

有文章和评论。

class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :article, counter_cache: true
end

您可以通过执行以下操作来计算评论数量: @ article.comments_count

问题是 - 您如何计算对特定@article发表评论的唯一身份用户数? (注意:唯一用户可以留下多条评论)

这是一个场景:

  
      
  1. comment - user_id(1)
  2.   
  3. comment - user_id(4)
  4.   
  5. comment - user_id(1)
  6.         

    评论数= 3   评论者(留下评论的唯一用户)count = 2

5 个答案:

答案 0 :(得分:3)

Rails拥有精彩的distinct query method,可以轻松生成此特定查询:

Comment.where(article_id: article.id).select(:user_id).distinct.count

生成以下SQL:

SELECT DISTINCT COUNT(DISTINCT "comments"."user_id") FROM "comments" WHERE "comments"."article_id" = ?

这种方法的好处是允许数据库完成繁重的工作。数据库通常比直接在Ruby中操作对象快几个数量级。

如果您愿意按如下方式修改Article课程:

class Article < ActiveRecord::Base
  has_many :comments
  has_many :commenters, through: :comments, source: :user
  has_many :unique_commenters, -> { distinct }, through: :comments, source: :user
end

您还可以使用以下代码生成查询:

article.unique_commenters

生成以下SQL:

SELECT DISTINCT "users".* FROM "users" INNER JOIN "comments" ON "users"."id" = "comments"."user_id" WHERE "comments"."article_id" = ?

答案 1 :(得分:1)

尝试使用pluckuniq

@article.comments.uniq.pluck(:user_id)

或仅pluck

@article.comments.pluck("DISTINCT user_id")

答案 2 :(得分:0)

article.comments.collect(&:user).uniq{|user| user.id}.count

答案 3 :(得分:-1)

你可以使用Ruby的Set

unique_commenters = Set.new

comments.each do |comment|
  unique_commenters.add comment.user
end

unique_commenters.to_a

你也可以在集合上做commenters.uniq!,但我觉得效率较低。

答案 4 :(得分:-1)

我知道的最好方法是创建一个范围:

class Comment
  belongs_to :user
  belongs_to :article, counter_cache: true  

  scope :count_by_user ->(user) { where(user_id: user.id).count }
end

然后:

@article.comments.count_by_user(user) # 2