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