1. Conclusion </ b>
2. Quel est le problème N + 1? </ B>
3. Pourquoi N + 1 problème </ b>
4. Comment résoudre le problème N + 1 </ b>
Utilisez la méthode comprend </ b>!
Il s'agit d'un problème qui se produit lors de l'association. Si vous formez une association sans prendre de mesures, une base de données et une base de données B seront Pour se référer à chacun d'eux un par un C'est un problème qui nécessite beaucoup de traitement et retarde l'opération.
L'origine est N + 1 car tous les enregistrements sont combinés en 1 + N enregistrements à l'intérieur.
Par exemple, prenez l'exemple suivant.
N+1 problème
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 |
Dans cet état,
@students = Student.all
Ensuite, étudiant et personnel Après avoir assemblé un à un avec le modèle et la base de données, Aussi, lors de la réflexion sur la vue avec le contrôleur Je vais faire la même chose.
Dans ce formulaire, (Table des étudiants 1 fois + nombre de références de données 15 fois) * 2 fois Cela signifie que cela va traiter!
La méthode comprend </ b> résout ce problème!
Pour le moment, vous pouvez apporter tous les modèles associés et les faire correspondre un par un en les reflétant dans la vue avec le contrôleur.
Vous n'êtes pas obligé de faire la même chose deux fois, ce qui allège le processus. Ce qui précède est une petite quantité de données, donc ce n'est pas un gros problème, mais s'il y en a des milliers ou des dizaines de milliers, le traitement sera différent.
Comment utiliser
@students = Student.includes(:personal)
Nom du modèle.includes(:紐づけたいNom du modèle)
Seulement!