在Rails关系中清理N + 1个查询

时间:2017-12-06 01:48:20

标签: ruby-on-rails

我有一个GET方法,在加载日历页面时会调用它:

def get_events
  @events.select {|event| event.task.present? }.each do |event|
    target_contact = event.task.primary_contact
    owner = event.task.task_followers.where(owner: true).first.follower
    events << { id: event.id, title: event.title, contact: target_contact, owner: owner }
  end
  render json: events.to_json
end

我有数百万个事件,我看到了大量的N + 1个查询,因为它会加载单个事件和关系。我知道Rails提供了一种包含方法来消除此类查询。但include方法只需要符号参数:

Event.includes(:task)

我不认为使用include方法构建我的json响应是不可能的。

以下是关系:

class Event < ActiveRecord::Base
  belongs_to :task
end 

class Task < ActiveRecord::Base
  has_many :task_followers, dependent: :destroy
end

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以加载如下的嵌套关联:

Event.includes(task: [task_followers: :follower])