1

My Event has_many :event_people、 AnEventPersonには、とりわけ「役割」と呼ばれるフィールドがあります。

EventPersonwith 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")
4

1 に答える 1

2

集計と を使用して、このタイプのクエリにアプローチしますhaving

select ep.id
from event_people ep
group by ep.id
having sum(case when ep.role = 'Moderator' then 1 else 0 end) = 0;

つまり、各イベントのモデレーターの数を数えます。何もない場合は、イベントを返します。

これをアクティブレコードで表現する方法がわかりません。

于 2013-05-16T19:35:13.053 に答える