一个事件有许多参与者。每个参与者都有一个"状态"字段。
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
范围内)中有某个状态不是“present”而是“away”,那么事件仍然会被获取,因为至少一些兄弟记录的状态等于某个不是“present”的东西。
我需要确保过滤掉每个参与者状态都为“present”的所有事件记录。
我可以接受ActiveRecord或SQL的解决方案。