найти все родительские записи, где все дочерние записи имеют заданное значение (но не только некоторые дочерние записи)

Событие имеет много участников. Участник имеет поле «статус».

class Event < ActiveRecord::Base
  has_many :participants
end

class Participant < ActiveRecord::Base
  belongs_to :event
end

Мне нужно найти все события, кроме следующих: события, где каждый из участников имеет статус «присутствует».

Я могу найти все события, где некоторые из его участников имеют статус «присутствует» со следующим кодом AR:

Event.joins(:participants).where
 .not(participants: {status: 'present'})
  .select("events.id, count(*)")
   .group("participants.event_id")
    .having("count(*) > 0")

Это создает SQL как:

SELECT events.id, participants.status as status, count(*) 
FROM `events` INNER JOIN `participants` 
ON `participants`.`event_id` = `events`.`id` 
WHERE (`participants`.`status` != 'present') 
GROUP BY participants.event_id HAVING count(*) > 0

этопочти работает. Проблема в том, что если одна из строк участника (в рамках@participant.event_id) имеет статус чего-то другого, например, «прочь», событие все равно будет извлечено, потому что, по крайней мере, некоторые из записей одного уровня имеют статус, равный чему-то другому, чем «настоящее».

Мне нужно убедиться, что я отфильтровываю каждую запись события свсе участники статуса "настоящего".

Я открыт для ActiveRecord или решений SQL.

Ответы на вопрос(5)

Ваш ответ на вопрос