1
我的Event
has_many :event_people
,EventPerson
其中有一个名为“角色”的字段。用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")
通过指向我“有”和聚合,我设法找到正确的翻译到ActiveRectord。我已经添加到我的问题作为说明。 – berkes