模型
用户拥有客户,其中包含具有任务的项目。
我正在尝试使用[Name,Count]构建一个数组来发送到Google Chart - 我已经解决了所有这些问题但是已经解决了这个问题:
int resources = getIntent().getIntExtra("resource", 0);
String message = getIntent().getString("message");
此查询返回11个条目。实际上这是该用户的所有条目。它完全绕过def task_by_project(user)
task_arr = user.projects.joins(:tasks).where("tasks.completed = ?", "0").uniq.collect { |d| [d.name, d.tasks.count] }.to_a
task_arr.unshift(['Projects', 'Uncompleted Tasks'])
return task_arr
end
。已完成7个未完成的4个。
在视图中,我使用循环呈现略有不同:
where
我非常有信心这与我对如何深入查询关联的误解有关。
END RESULT是我需要Project的名称,以及它有多少任务的计数。
我是通过 <% current_user.projects.uniq.each do |project| %>
<%= link_to project.name + " || " + project.tasks.where(completed: 0).count.to_s + " tasks remaining currently", project, :class => "collection-item" %>
<% end %>
</div>
将Task
加回到Project
上Project.ID
来通过查询执行此操作的 - 但我不确定如何对整个集合执行此操作。
(&#39; unshift&#39;的目的是因为其他方面我得到的结果格式为[[['Projects', 'Tasks'], [['First Record, 2] ... ]]
,这不是GCharts格式。多)
答案 0 :(得分:1)
也许是这样的?
projects = user.projects
.select("projects.name, COUNT(uncompleted_tasks.id) AS uncompleted_tasks_count")
.joins("LEFT OUTER JOIN tasks AS uncompleted_tasks ON uncompleted_tasks.project_id = projects.id AND uncompleted_tasks.completed = 0")
.group("projects.id")
.map { |project| [project.name, project.uncompleted_tasks_count] }
答案 1 :(得分:0)
使用.pluck
来获取列值
user.projects.left_joins(:tasks).where("tasks.completed = 0")
.distinct
.pluck('users.id, users.name, tasks.count')
.map { |a| a.pop(2) }
.pluck
效率更高,因为它只是查询传递给pluck的列并返回一个数组数组,而不是将一堆模型加载到内存中。
# => [[1, 'Frank', 0], [2, 'Muhammad', 5], [3, 'Jane', 3]]
但是,除非您的名称列是唯一的,否则您应该选择用户ID以清除重复项。 .map { |a| a.pop(2) }
删除了结果数组中的id。
从数据库中提取记录并在其上调用.uniq
是一个巨大的反模式。你从数据库中提取大量数据,然后在Ruby中整理出重复数据。这可能会导致严重的性能问题。
处理状态的更好方法是使用ActiveRecord::Enum:
class Task
enum :status, [:incomplete, :complete, :deleted]
end
可以让您查询:
Task.incomplete
Task.completed
并为您提供内部和变异方法:
task.complete?
task.complete!
您可以像这样使用它:
user.projects.left_joins(:tasks).where(tasks: Task.incomplete)
.distinct
.pluck('users.id, users.name, tasks.count')
.map { |a| a.pop(2) }