найти все родительские записи, где все дочерние записи имеют заданное значение (но не только некоторые дочерние записи)
Событие имеет много участников. Участник имеет поле «статус».
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.