ActiveRecord найти родителя на основе несуществующего потомка - PullRequest
0 голосов
/ 29 мая 2018

Предположим, существует материал с отношением has_many с AttributeType.Я могу найти Родителя Детей, имя которого равно "abc".Я хочу найти Родителя, который не содержит ребенка, имя которого равно "abc".Я уже пробовал что-то вроде этого:

attribute_types = @place.materials.collect(&:attribute_types).flatten.select{|at| at.name != "abc"}.flatten

, но так как он только не подхватывает ребенка с именем "abc", он все равно получает братьев и сестер.Поэтому, когда я использую:

materials = @place.materials.where(id: attribute_types.map(&:material)).uniq

Он по-прежнему получает запись, которая мне не нужна.

Что я ищу, так это когда несколько материалов имеют attribute_types 'abc', 'def 'и' ghi ', я хочу найти материал, в котором нет' abc '.

1 Ответ

0 голосов
/ 29 мая 2018

Из других ответов / комментариев, которые я выводю, вы не только хотите найти материалы, связанные с атрибутом, который не называется «abc», но и исключить материалы, имеющие ссылку на атрибут abc.

Сначала найдите все материалы, имеющие атрибут abc

materials_with_abc = @place.materials.joins(:attribute_types)
                                     .where(attribute_types: {name: 'abc'})

Затем найти все материалы, не связанные с abc, довольно просто

@place.materials.where.not(id: materials_with_abs.select(:id))

(сначала я написал с картой, котораянеоптимальный, если не сказать больше, но благодаря подсказке @enigineersmnky это генерирует один запрос и выполняется полностью в базе данных и очень эффективно. Не нужно и вручную кодировать sql!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...