我有两个专业人士和项目模型
专业人士有很多项目
项目属于专业人士
在专业人士索引页面中,我需要显示专业人员的项目数量。
现在我正在进行以下查询以获取所有专业人员。 我如何获取每个专业人员的项目计数。
@pros = Professionals.all.asc(:name)
答案 0 :(得分:2)
我会将projects_count添加到Professional
然后
class Project
belongs_to :professional, counter_cache: true
end
每次将项目添加到专业人员或从专业人员中删除时,rails都会处理计数。然后你就可以对每个专业人士做.projects_count。
编辑: 如果你真的想要额外的数据
@pros = Professionals.includes(:projects).order(:name)
然后
@pros.each do |pro|
pro.name
pro.projects.each do |project|
project.name
end
end
答案 1 :(得分:2)
我只是在这里抽象,因为导轨的东西真的不是我的包。但是,让我们谈谈架构和要寻找的事情。因此,代码实际上只是“伪代码”,但应该关闭到想要的东西。
考虑“只是”MongoDB将如何存储数据,并且您可能看起来有多个集合。我并不是说最佳模型是否存在,而只是处理它。
让我们假设我们有“项目”的数据
{
"_id" : ObjectId("53202e1d78166396592cf805"),
"name": "Project1,
"desc": "Building Project"
},
{
"_id" : ObjectId("532197fb423c37c0edbd4a52")
"name": "Project2",
"desc": "Renovation Project"
}
对于“专业人士”,我们可能会有这样的事情:
{
"_id" : ObjectId("531e22b7ba53b9dd07756bc8"),
"name": "Steve",
"projects": [
ObjectId("53202e1d78166396592cf805"),
ObjectId("532197fb423c37c0edbd4a52")
]
}
右。所以现在我们看到“专业”必须有某种概念,即在另一个集合中有相关项目以及相关项目是什么。
现在我认为,(并且不是我的包)有一种方法可以降低Mongoid中驱动程序实现的较低级别(我相信是轻便摩托车的顶部)并且它很可能(以类似的方式调用(来自内存)(将“Professionals”作为类模型名称):
Professionals.collection.aggregate([
{ "$unwind": "$projects" },
{ "$group": {
"_id": "$_id",
"count": { "$sum": 1 }
}
])
或者以某种类似的形式,或多或少类似于你在本机mongodb shell中所做的那样。关键是,通过这样的方式,您只需要服务器完成工作,而不是将所有结果都拉到客户端并循环遍历它们。
建议您使用本机代码来迭代数据存储中的结果会产生反效果,并且使用任何类型的后端数据库存储都可以直观地反对。无论是SQL数据库还是NoSQL数据库,只要数据库具有进行聚合工作的方法,然后使用它们,一般的首选项就是。
如果您编写的代码基本上从您的商店中提取每条记录,然后循环以获得结果,那么您做错了。
使用数据库方法。否则你也可以只使用一个文本文件并完成它。