我的Event
has_many :event_people
,其中EventPerson
有一个名为“角色”的字段。
我想查找查询或WHERE以返回没有EventPerson
角色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' )
这会返回一个carthesian产品(它会多次返回一个事件,每个关系返回一次),即使它们“没有主持人”,它仍会返回事件。由于事件可以event_people
具有“发言人”或“协调员”等角色。
这会是什么SQL?将其转换为ActiveRecord的加分点。
按照having上的提示操作后,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")
答案 0 :(得分: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;
即,计算每个事件的主持人数量。如果没有,请返回活动。
我不知道如何在activerecord中表达这一点。