【发布时间】:2018-02-22 21:17:17
【问题描述】:
我正在开发一个任务管理系统,其中project 有许多tasks,task 可以分配给users。
我想添加一个“我的任务”页面,在下面显示所有项目以及当前用户的任务。
像这样,每个任务都分配给current_user。
Project #1
- task 1
- task 2
Project #2
- task 1
- task 2
Project #3
- task 1
- task 2
- task 3
我想用伪 ActiveRecord 代码实现的目标:
@projects_with_tasks = current_user.projects.includes(:tasks).where(tasks: { user_id: current_user.id })
然后我想遍历每个项目,列出分配给 current_user 的任务:
<% @projects.each do |project| %>
<%= project.title %>
<ul>
<% project.tasks.each do |task| %>
<li><%= task.title %> - <%= task.due_date %></li>
<% end %>
</ul>
<% end %>
看起来很简单,但是当我调用 project.tasks 时,它会返回并加载项目的所有任务,而不仅仅是 current_user 的任务。
有没有办法有效地获取项目和过滤的任务列表?
我目前最好的解决方案是先获取所有项目,然后对其进行迭代,并进行单独的数据库查询以检索所有过滤后的任务。但是,如果有人参与了 20 多个项目(可能在我的用例中),那么这就是 21 多个查询(1 个用于所有项目,1 个用于任务)。不要介意某些用户将拥有 50 个项目的情况......
我更喜欢将所有内容都保存在 ActiveRecord 中,但我也知道这可能是创建带有一些 SQL 的查询对象的情况。
【问题讨论】:
标签: sql postgresql optimization ruby-on-rails-5