1

My Event has_many :event_people, AnEventPerson除其他外有一个名为“角色”的字段。

我想找到查询或 WHERE 以返回没有EventPersonwith 角色的事件列表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 的奖励积分。

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")
4

1 回答 1

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

于 2013-05-16T19:35:13.053 回答