统计评论人数
Count number of commenters
有文章和评论。
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :article, counter_cache: true
end
您可以通过执行以下操作来计算评论数:
@article.comments_count
问题是 - 您如何计算对特定@article 发表评论的唯一用户数? (注意:一个唯一用户可以发表多条评论)
这是一个场景:
- comment - user_id(1)
- comment - user_id(4)
- comment - user_id(1)
comments count = 3
commenters (unique user who left a comment) count = 2
您可以为此使用 Ruby 的 Set
:
unique_commenters = Set.new
comments.each do |comment|
unique_commenters.add comment.user
end
unique_commenters.to_a
您也可以只对集合执行 commenters.uniq!
,但我认为这样效率较低。
@article.comments.uniq.pluck(:user_id)
或 pluck
@article.comments.pluck("DISTINCT user_id")
article.comments.collect(&:user).uniq{|user| user.id}.count
我知道的最好方法是创建一个范围:
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
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:
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" = ?
有文章和评论。
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :article, counter_cache: true
end
您可以通过执行以下操作来计算评论数: @article.comments_count
问题是 - 您如何计算对特定@article 发表评论的唯一用户数? (注意:一个唯一用户可以发表多条评论)
这是一个场景:
- comment - user_id(1)
- comment - user_id(4)
- comment - user_id(1)
comments count = 3
commenters (unique user who left a comment) count = 2
您可以为此使用 Ruby 的 Set
:
unique_commenters = Set.new
comments.each do |comment|
unique_commenters.add comment.user
end
unique_commenters.to_a
您也可以只对集合执行 commenters.uniq!
,但我认为这样效率较低。
@article.comments.uniq.pluck(:user_id)
或 pluck
@article.comments.pluck("DISTINCT user_id")
article.comments.collect(&:user).uniq{|user| user.id}.count
我知道的最好方法是创建一个范围:
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
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:
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" = ?