My Event
has_many :event_people
, AnEventPerson
除其他外有一个名为“角色”的字段。
我想找到查询或 WHERE 以返回没有EventPerson
with 角色的事件列表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")