My Event
has_many :event_people
、 AnEventPerson
には、とりわけ「役割」と呼ばれるフィールドがあります。
EventPerson
with roleなしでイベントのリストを返すクエリまたは WHERE を見つけたいModerator
。
Event.join(:event_people).where("event_people.role <> 'moderator' ")
これにより、次の SQL が生成されます。
SELECT `events`.* FROM `events` INNER JOIN `event_people` ON `event_people`.`event_id` = `events`.`id` WHERE (event_people.event_role <> 'moderator' )
これはデカルト積を返します (単一のイベントをリレーションごとに 1 回ずつ複数回返します)。「モデレーターがいない」場合でもイベントを返します。イベントにはevent_people
、「スピーカー」や「コーディネーター」などの役割を持たせることができるためです。
これに対する SQL は何でしょうか? それをActiveRecordに変換するためのボーナスポイント。
のヒントに従って、ActiveRecord で解決します。
Event.select("events.*").joins(:event_people).group("event_people.id").having("sum(case when event_people.role = 'Moderator' then 1 else 0 end) = 0")