Check N+1 query dùng gem bullet
Bài đăng này đã không được cập nhật trong 3 năm
Cài đặt gem
Thêm dòng sau vào Gemfile
gem "bullet"
Sau đó gõ trong console
bundle install
Thêm đoạn mã sau vào config/environments/development.rb
config.after_initialize do
Bullet.enable = true
Bullet.alert = true
Bullet.bullet_logger = true
Bullet.console = true
Bullet.rails_logger = true
Bullet.add_footer = true
end
Chạy server sau đó vào từng trang một, nếu thấy có thông báo như sau thì bạn đã bị N+1 query. Dưới bottom cũng hiện như vậy:
Trong thông báo đó cũng đã hướng dẫn mình cần làm gì, ở dòng bao nhiêu, như ví dụ trên ta có ở file _user_subject.html.erb.2 -> dòng 2.
Dưới bottom cũng sẽ hiển thị mình cần làm gì:
user: xoan N+1 Query detected UserSubject => [:user] Add to your finder: :includes => [:user]
-> Cần thêm .includes(:user) vào biến trong dòng đó. Ví dụ code của mình là:
@course = Course.includes(course_subjects: :user_subjects)
.find params[:course_id]
Ở hàm show của user_subject, mình có gọi user_subject.user -> bị N+1 query ở đó -> trong code kia của mình sẽ phải sửa như sau:
@course = Course.includes(course_subjects: [user_subjects: :user])
.find params[:course_id]
Trường hợp bị thừa sẽ có thông báo:
Vì mình đã includes thừa:
@course = Course.includes(course_subjects: [:subject, user_subjects: :user])
.find params[:course_id]
-> Sửa lại như sau:
@course = Course.includes(course_subjects: [user_subjects: :user])
.find params[:course_id]
Cũng có thể sẽ thông báo như vậy nhưng các bạn cần includes trong view tùy vào các trường hợp. Cảm ơn các bạn đã xem.
All rights reserved
Bình luận