Активная запись: как найти родителя на основе отсутствия связи с данным атрибутом - PullRequest
0 голосов
/ 30 июня 2019

У меня следующая структура базы данных:

Parent
 -> child 1
 -> child 2
 ->.. 

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

Пример:

Should not be found: 
Parent: 
 -> child 1 (selected: true)
 -> child 2 (selected: false)

Should be found
Parent: 
 -> child 1 (selected: nil)
 -> child 2 (selected: false)

В настоящее время у меня есть следующее:

Project.all - Project.includes(:project_images).where(project_images: { selected: true })

Это прекрасно работает, но, похоже, несколько неэффективно. Я считаю, что должен быть более простой и быстрый путь.

Ответы [ 3 ]

0 голосов
/ 01 июля 2019

Вы можете просто использовать where.not, чтобы решить это.

см https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods/WhereChain.html#method-i-not

Project.joins(:project_images).where.not(project_images: { selected: true })
0 голосов
/ 11 июля 2019

Project.joins (: project_images) .where ("project_images.selected NOT IN (TRUE)");

0 голосов
/ 01 июля 2019
    parents = Parent.joins(:children).where('children.selected = FALSE or children.selected is NULL')

Этот запрос выбирает строки из таблицы внутреннего объединения дочерних элементов родителей с выбранным атрибутом, для которого не установлено значение true.

Если вы хотите, чтобы родительские объекты не имели даже дочернего дочернего элемента, вы должны оставить дочерние элементы внешнего объединения.

Parent.joins('left join children on parents.id = childrenparent_id')..where('children.selected = FALSE or children.selected is NULL')
...