Rails基于相关记录列值的联接查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails基于相关记录列值的联接查询相关的知识,希望对你有一定的参考价值。
我有两种型号:
Project
attributes: id, status (open, cancelled, reopened)
has_many: todos
Todo
attributes: id, project_id, status (done, partially_done, pending)
belongs_to: project
我必须使用选项卡:Done
和Pending
在这两个选项卡中,我必须根据相关的待办事项状态显示项目。
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?)}
但是似乎很耗时。有什么办法可以有效地做到这一点?
提前感谢!
答案
您可以执行以下操作:
pending_projects = Project.joins(:todos).where(todos: { status: :pending })
通过这种方式,您可以将所有正确的记录交给数据库引擎,这是正确的。
以上是关于Rails基于相关记录列值的联接查询的主要内容,如果未能解决你的问题,请参考以下文章