Rails多对一关系聚合函数(组,计数)活动记录

时间:2016-09-23 20:12:07

标签: ruby-on-rails postgresql rails-activerecord active-record-query

我有两种模式,多对一关系:

class Event
  has_many :comments 
end

class Comment
  # notice enum for comment status: pending => 0, approved => 1
  enum status: [:pending, :approved]
  belongs_to :event
end 

我想获得一些特定事件的评论统计数据。例如,对于ID为1的事件,查找其所有注释并计算待处理和批准的注释数量。例如,返回id为1的事件及其评论统计数据

    [
      id: 1, #event id and all event related data 
      comment_stats = { pending: 3, approved: 20} 
   ]

此外,数据应包含所有事件字段以及comment_stats哈希

我不知道采取什么方法。

我的第一次尝试如下

event = Event.find(params[:id])
event.messages.select(:status)

这是我需要对ID为1的事件进行分组和计数评论统计数据的地方。

这给了我一些消息,例如

    [
      { " id":null, "status": "pending"}, 
      { "id": null, "status": "approved"} ...
   ]

在这里,我想将这个哈希数组分组为:

comment_stats = { pending: 3, approved: 20}

我真的不在乎。我非常感谢能得到的任何帮助。

1 个答案:

答案 0 :(得分:1)

class Event
  def stats
    {
      event_id:      id,
      event:         self,
      comment_stats: {
        pending:  comments.where(status: Comment.statutes[:pending]).count,
        approved: comments.where(status: Comment.statutes[:approved]).count
      }
    }
  end
end

用法:

event = Event.find(params[:id])
event.stats
#=> { event_id: 1, event: <Event object>, comment_stats: { pending:  10, approved: 20 } }
event.stats[:comment_stats]
#=> { pending:  10, approved: 20 }