1. Conclusion </ b>
2. What is the N + 1 problem </ b>
3. Why is it an N + 1 problem? </ B>
4. How to solve the N + 1 problem </ b>
Use the includes method </ b>!
This is a problem that occurs when you are associating. If you form an association without taking measures, A database and B database will be To refer to all of them one by one This is a problem that requires a lot of processing and delays the operation.
The origin is N + 1 because all the records are combined into 1 + N records inside.
For example, take the following example.
N+1 problem
class Student < ActiveRecord::Base
has_many :personals
end
class Personal < ActiveRecord::Base
belongs_to :student
end
Student_Tabel
id | student_name | student_age |
---|---|---|
1 | Ayabe | 15 |
2 | Sato | 16 |
3 | Ito | 14 |
Personal_Tabel
id | student_id | student_personality |
---|---|---|
1 | 1 | angry |
2 | 2 | gentle |
3 | 3 | smart |
4 | 1 | shy |
5 | 1 | forgetful |
In this state,
@students = Student.all
Then, Student and Personal After collating one by one with the model and the database, Also, when reflecting on the view with the controller I will do the same.
In this form, (Students table 1 time + data reference count 15 times) * 2 times It means that it will process!
The includes method </ b> solves this problem!
For the time being, you can bring all the related models and match them one by one when reflecting them in the view with the controller.
You don't have to do the same thing twice, which makes the process lighter. The above is a small amount of data, so it's not a big deal, but if there are thousands or tens of thousands of data, the processing will be different.
How to use
@students = Student.includes(:personal)
Model name.includes(:紐づけたいModel name)
Only!