Запрос присоединения Rails на основе значения столбца связанных записей - PullRequest
0 голосов
/ 16 марта 2020

У меня есть две модели:

Проект

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

Todo

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

Мне нужно на вкладки : Done и Pending На этих двух вкладках я должен показать проекты, основанные на статусе todo.

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

Он вернет проекты, в которых связанные задачи находятся в состоянии done / part_done.

Допустим, у меня есть два проекта:

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?)}

Но это кажется трудоемким. любой способ сделать это эффективно?

Заранее спасибо!

1 Ответ

0 голосов
/ 16 марта 2020

Вы можете сделать что-то вроде этого:

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

Таким образом, вы уступите всю работу по поиску подходящих записей для механизма БД, что является правильным.

...