Rails 多对一关系聚合函数(组、计数)活动记录
Rails many-to-one relationship aggregate functions (group, count) active record
我有两个多对一关系的模型:
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 的事件的 return 数据及其评论统计数据
[
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}
我真是没脑子了。我将不胜感激我能得到的任何帮助。
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 }
我有两个多对一关系的模型:
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 的事件的 return 数据及其评论统计数据
[
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}
我真是没脑子了。我将不胜感激我能得到的任何帮助。
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 }