Rails 4 N + 1查询包含

时间:2015-09-18 20:02:35

标签: ruby-on-rails ruby oracle performance

我正在使用bullet gem,它通知我N + 1查询。以下是我的模型的连接方式:

class Meeting < ActiveRecord::Base
  has_many :meeting_notes, dependent: :destroy
end

现在会见笔记课程:

class MeetingNote < ActiveRecord::Base
  belongs_to :department
  belongs_to :status
  belongs_to :budget_year
  belongs_to :notes_user, class_name: "User", foreign_key: :n_app_user_id
  belongs_to :leading_user, class_name: "User", foreign_key: :l_app_user_id    
end

部门和状态包含方法和数据库列department_namestatus_name。用户具有first_namelast_name db列,并且活动记录模型具有方法full_name,其返回first_namelast_name的连接或空字符串(如果没有)数据库中的那些。

因此,当我显示有关此类特定会议的信息时(如果忽略错误的synthax):

Name: #{Meeting_name}
Notes: 
For department: #{Department_name}
With status: #{Status_name}
Notes taking user: #{Notes_user_full_name}
User taking initiative: #{Leading_user_full_name}

这会触发N + 1查询,如下所示:

N+1 Query detected
  meeting_note => [:leading_user]
  Add to your finder: :includes => [:leading_user]

这是我的疑问:

Meeting.includes(meeting_notes: [:department, :status, :notes_user, :leading_user])
.where('budget_year.budget_year_id + ?', by_id).references(:budget_year)

但是,当我从查询和ui视图中删除leading_user时,请按以下方式进行查询:

Meeting.includes(meeting_notes: [:department, :status, :notes_user])
    .where('budget_year.budget_year_id + ?', by_id).references(:budget_year)

或者如果我将leading_user留在查询和ui视图上并且我取出notes_user,则N + 1查询不会显示。

这不仅仅是子弹的东西,也是我看日志的时候。当有子弹警告时,我看到来自用户表的多个选择,这将是N + 1个查询。当没有子弹警告时,我没有看到从用户查询的个别选择。我该怎么做才能避免N + 1?

有没有类似的经历?你是怎么解决的?

0 个答案:

没有答案