2013-05-16 50 views
1

我的Eventhas_many :event_peopleEventPerson其中有一个名为“角色”的字段。用Has_many,如何返回没有某个相关对象的对象列表?

我想找到查询或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的Bonuspoints。

解决方案在ActiveRecord中,在按照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; 

也就是说,算起来每个事件的主持人数量:

Event.select("events.*").joins(:event_people).group("event_people.id").having("sum(case when event_people.role = 'Moderator' then 1 else 0 end) = 0") 

回答

2

我使用的聚集和having接近这种类型的查询。如果没有,请返回事件。

我不知道如何在activerecord中表达这一点。

+0

通过指向我“有”和聚合,我设法找到正确的翻译到ActiveRectord。我已经添加到我的问题作为说明。 – berkes

相关问题