2013-05-16 81 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

相關問題