我正在使用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_name
和status_name
。用户具有first_name
和last_name
db列,并且活动记录模型具有方法full_name
,其返回first_name
和last_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?
有没有类似的经历?你是怎么解决的?