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

我必须使用选项卡: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?)}

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

提前感谢!

答案

您可以执行以下操作:

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

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

以上是关于Rails基于相关记录列值的联接查询的主要内容,如果未能解决你的问题,请参考以下文章

Arel、联接和 Rails 查询

Laravel 查询,其中列值大于相关模型列值的总和

通过具有最大列值的记录过滤 Django 查询

Laravel Eloquent - 来自相关数据的多个记录的列值的总和

如何选择不同列值的最新记录?

在其中一个联接上选择具有最大值的记录