使用Has_many,如何返回没有某个相关对象的对象列表?

时间:2013-05-16 18:57:35

标签: sql ruby-on-rails activerecord

我的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")

1 个答案:

答案 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中表达这一点。