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

Posted

技术标签:

【中文标题】Rails 多对一关系聚合函数(组、计数)活动记录【英文标题】:Rails many-to-one relationship aggregate functions (group, count) active record 【发布时间】:2017-02-01 18:57:46 【问题描述】:

我有两个处于多对一关系的模型:

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 的事件,查找其所有 cmets 并计算有多少 cmets 处于待处理状态并已批准。例如,返回 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】:
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 

【讨论】:

如何将散列的嵌套散列展平,以便只有一个散列具有嵌套的 comment_stats 散列,例如 event_data,comment_stats:待定:10,批准:20?而不是 event : id: 1, etc ,comment_stats: pending: 10, approved: 20 @ElvynMejia 您可以向类Event:def self.stats all.each_with_object() |event, hash| hash[event] = event[:comment_stats] end 添加一个方法 - 这将返回单个哈希,其中键是事件实例,值是它的统计信息。 它不允许我编辑,因为它太短了,但 Comment.statutes 不应该是 Comment.status @MageeWorld no, plural is correct. 我的意思不是要成为一个聪明的驴子——但是 statutes 什么时候变成了 status 的复数形式?

以上是关于Rails 多对一关系聚合函数(组、计数)活动记录的主要内容,如果未能解决你的问题,请参考以下文章

JPA/Hibernate - 多态多对一关系设计

在 NestJS 中以多对一关系添加字段

正确配置多对一关系 ef core

关联映射级联操作关系维护 ---- Hibernate之一对多|多对一关系

django--ORM表的多对一关系

休眠:多对一关系失败