Rails 5 - 查询' parent'的名称的关联。和孩子的数量'

时间:2017-10-14 08:01:58

标签: ruby-on-rails ruby-on-rails-5

模型

用户拥有客户,其中包含具有任务的项目。

我正在尝试使用[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加回到ProjectProject.ID来通过查询执行此操作的 - 但我不确定如何对整个集合执行此操作。

(&#39; unshift&#39;的目的是因为其他方面我得到的结果格式为[[['Projects', 'Tasks'], [['First Record, 2] ... ]],这不是GCharts格式。多)

2 个答案:

答案 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) }