Rails基于相关记录列值的联接查询

问题描述 投票:0回答:1

我有两种型号:

Project

attributes: id, status (open, cancelled, reopened)
has_many: todos 

Todo

attributes: id, project_id, status (done, partially_done, pending)
belongs_to: project

我必须使用选项卡:DonePending在这两个选项卡中,我必须根据相关的待办事项状态显示项目。

Project.all.includes(:todos).where(todos: {status: ['done', 'partially_done']})

它将返回Projects,其中相关的待办事项处于“完成/部分完成”状态。

让我们说:我有两个项目:

Project 1 -> Todo 1 (done), Todo 2 (partially_done), Todo 3 (pending)
Project 2 -> Todo 4 (done), Todo 5 (partially_done), Todo 6 (done)

done标签中:仅显示项目2(因为所有待办事项已完成或部分完成)

pending标签中,仅显示项目1(因为一个待办事项仍处于待处理状态)

如何根据待办事项过滤项目?

我可以做类似的事情:

pending_projects = Project.joins(:todos).select{|project| project.todos.any?(&:pending?)}

但是似乎很耗时。有什么办法可以有效地做到这一点?

提前感谢!

ruby ruby-on-rails-5 rails-activerecord
1个回答
0
投票

您可以执行以下操作:

pending_projects = Project.joins(:todos).where(todos: { status: :pending })

通过这种方式,您可以将所有正确的记录交给数据库引擎,这是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.