[RUBY] Je veux résoudre le problème N + 1 où les données sont plus rassemblées et l'opération devient lente.

【Aperçu】

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>

  1. Conclusion

Utilisez la méthode comprend </ b>!


2. Quel est le problème N + 1?

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.


3. Pourquoi le problème N + 1

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!


4. Comment résoudre le problème N + 1

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!


Recommended Posts