Rails ActiveRecord 范围多对多查询

Rails ActiveRecord scoped many to many query

在我的模型中,Event 和 Artist 都是 HABTM 关系。 事件默认按日期限定为当前事件,因此仅显示尚未发生的事件。我正在尝试编写一种方法或范围以从没有当前事件的艺术家那里获取所有内容。我尝试了 ActiveRecord 关系

none = Artist.where{|a| a.events.default_scope.count == 0}

但是这个returns

ActiveRecord::QueryMethods::WhereChain

然后我无法使用实际对象。然后,当我遍历 .all 时,它非常慢,因为模型中有大量数据。

Artist.all.select{|a| a.events.default_scope.count == 0}

处理这个问题的更快或更好的方法是什么?

对事件和联接使用 LEFT JOIN table,添加条件以仅包含当前事件,并仅获取没有事件的艺术家:

scope :no_events, -> {
  joins('LEFT JOIN artists_events ON artists.id = artists_events.artist_id')
  .joins('LEFT JOIN events ON events.id = artists_events.event_id')
  .where([here the condition for current events])
  .where('events.id IS NULL') 
}

您可能需要添加 distinct