Fonction Strict_loading pour supprimer l'occurrence de problème N + 1 ajoutée à partir des rails 6.1

Maintenant que rails 6.1rc est sorti, nous avons mis au point une nouvelle fonctionnalité, la fonction strict_loading. See: https://weblog.rubyonrails.org/releases/

  1. #strict_loading

En marquant un objet, l'exception ActiveRecord :: StrictLoadingViolationError sera déclenchée lorsque l'objet est chargé avec un délai d'association.

$ dev = Developer.strict_loading.first
$ dev.audit_logs.to_a
=> ActiveRecord::StrictLoadingViolationError: Developer is marked as strict_loading and AuditLog cannot be lazily loaded.

See: https://github.com/rails/rails/pull/37400

  1. has_many :projects, strict_loading: true Comment définir dans l'option d'association. Toutes les associations spécifiées lèveront l'exception ActiveRecord :: StrictLoadingViolationError lors du chargement différé.
class Developer < ApplicationRecord
  has_many :projects, strict_loading: true
end

dev = Developer.first
dev.projects.first
# => ActiveRecord::StrictLoadingViolationError: The projects association is marked as strict_loading and cannot be lazily loaded.

See: https://github.com/rails/rails/pull/38541

  1. self.strict_loading_by_default = true Comment spécifier par modèle. Toutes les associations de tout le modèle spécifié lèveront l'exception ActiveRecord :: StrictLoadingViolationError lors du chargement différé.
class Developer < ApplicationRecord
  self.strict_loading_by_default = true

  has_many :projects
end

dev = Developer.first
dev.projects.first
# => ActiveRecord::StrictLoadingViolationError Exception: Developer is marked as strict_loading and Project cannot be lazily loaded.

See: https://github.com/rails/rails/pull/39491

Autre

Il est maintenant possible de sélectionner la sortie du journal ainsi que l'occurrence d'exception dans le comportement lorsque strict_loding est détecté.

config.active_record.action_on_strict_loading_violation enables raising or logging an exception if strict_loading is set on an association. The default value is :raise in all environments. It can be changed to :log to send violations to the logger instead of raising.

config.active_record.action_on_strict_loading_violation = :log

See https://github.com/rails/rails/pull/40511 https://edgeguides.rubyonrails.org/configuring.html#configuring-active-record

Cela permet de lever une exception dans les environnements de développement et de test et de conserver la sortie du journal dans l'environnement de production.

Discussion à WTF

La communauté discute également activement des moyens d'empêcher l'apparition de N + 1. https://discuss.rubyonrails.org/t/n-1-queries-should-be-the-exception-not-the-easy-trap-to-fall-in/74537/14

Recommended Posts

Fonction Strict_loading pour supprimer l'occurrence de problème N + 1 ajoutée à partir des rails 6.1
Bouton [Rails] pour revenir en haut de la page
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
[Rails] Procédure de mise en œuvre lorsque des fonctions publiques / privées sont ajoutées à la fonction de publication
Comment écrire Scala du point de vue de Java
[Débutant] Découvrez le problème N + 1! Comment utiliser Bullet
[Rails] Comment changer le nom de colonne de la table
[Rails] Comment obtenir le contenu des paramètres forts
L'histoire de la montée de Spring Boot de la série 1.5 à la série 2.1 part2
À propos de la fonction de Spring Boot en raison de différentes versions
Accédez à l'abréviation à partir de 5 exemples de listes Java en italique
Une note sur la fonction de départ de Ruby on Rails
Comment obtenir les informations les plus longues de Twitter à partir du 12/12/2016
[Rails] Fonction de recherche et de liste de produits à partir de catégories à plusieurs niveaux
[Rails] Comment afficher une liste de messages par catégorie
[Rails] Où faire attention dans la description de la validation
Évitez le problème que la session ne peut pas être obtenue lorsque Canary est libéré lors de la mise à niveau de Rails 4.2.x vers 5.0.x
Ne sous-estimez pas le problème N + 1!
[Rails] Implémentation de la fonction de catégorie
Rails ~ Comprendre la fonction de message ~
[Rails] Implémentation de la fonction tutoriel
[Rails] Implémentation d'une fonction similaire
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
J'ai essayé d'implémenter le traitement Ajax de la fonction similaire dans Rails
[Rails] Comment obtenir l'URL de la source de transition et la rediriger
[Rails] Supprimez le SQL inutile en utilisant le contrôle de cache des associations
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
Vous voulez savoir ce que Ruby n est la puissance de 2? (Jugement de puissance de 2)
[Rails / Heroku / MySQL] Comment réinitialiser la base de données de l'application Rails sur Heroku
[Rails] Parlez de prêter attention à la valeur de retour de l'endroit
[Rails] Comment omettre l'affichage de la chaîne de caractères de la méthode link_to
[Rails] Comment changer le titre de la page du navigateur pour chaque page
[Rails] Lire le RSS du site et renvoyer le contenu au premier plan
De Java naissant (3 ans) à Node.js (4 ans). Et l'impression de retourner à Java
J'ai essayé de résoudre le problème de la campagne paiza "Challenge from Phantom Thief 813"
(Ruby on Rails6) Créer une fonction pour modifier le contenu publié
J'ai essayé de résoudre le problème de Google Tech Dev Guide
[Avec une explication de pourquoi le faire] Comment empêcher les autres de modifier avec l'application CRUD de Rails avec fonction d'authentification
[Rails] Procédure d'implémentation de la fonction pour taguer les posts sans gem + la fonction pour affiner et afficher les posts par tags