在我的模特中,Event和Artist都是HABTM关系。 事件默认按日期范围限定为当前事件,因此仅显示尚未发生的事件。我正在尝试编写一个方法或范围来从没有当前事件的Artist中获取所有内容。我尝试过ActiveRecord关系
none = Artist.where{|a| a.events.default_scope.count == 0}
但是这会返回
ActiveRecord::QueryMethods::WhereChain
然后我无法获得实际的对象。然后,当我迭代.all时它很慢,因为模型中有大量数据。
Artist.all.select{|a| a.events.default_scope.count == 0}
处理此问题的更快或更好的方法是什么?
答案 0 :(得分:1)
对事件和联接表使用LEFT JOIN,添加条件以仅包含当前事件,并仅获取没有事件的艺术家:
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