Rails ActiveRecord范围很多对很多查询

时间:2015-03-22 18:18:37

标签: ruby-on-rails-4 rails-activerecord

在我的模特中,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}

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

1 个答案:

答案 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