[RUBY] [Rails] Je veux tout réinitialiser car les données de l'environnement local sont incorrectes! Que faire avant ça

introduction

J'ai vu l'article Qiita suivant.

L'idée de couper l'original lorsque l'erreur n'est pas résolue \ -Qiita

Je voudrais que vous lisiez l'article ci-dessus pour plus de détails, mais dans un simple résumé, "Si les données dans l'environnement local deviennent étranges, recréons la base de données (après avoir confirmé que vous pouvez effacer les données)" est.

Cependant, j'ai personnellement pensé: "Eh bien, ce n'est pas si bon", alors j'ai décidé d'écrire un commentaire de réponse. Quand j'ai commencé à écrire des commentaires, cela devenait assez long, j'ai donc décidé d'en faire un article indépendant. C'est cet article.

C'est pourquoi je veux tout réinitialiser car les données de l'environnement local sont étranges! Voici ce que vous devez faire avant de réfléchir.

Je veux tout réinitialiser car les données de l'environnement local sont étranges! Que faire avant ça

(Remarque: Le contenu suivant a été écrit à l'origine comme un commentaire de réponse à l'article Qiita au début. Veuillez lire sur cette hypothèse)

La réinitialisation de la base de données est efficace lorsque «il est possible d'effacer toutes les données», mais elle ne peut pas être utilisée autrement. Les applications Rails développées comme passe-temps personnel peuvent convenir, mais les applications Rails développées au travail sont souvent dans un environnement local car elles contiennent beaucoup de "données de test que j'ai souvent utilisées". Cela signifie: "Je ne peux pas effacer tout cela." En outre, si le même problème se produit dans l'environnement de production au lieu de l'environnement de développement, la stratégie «d'effacement de toutes les données» ne peut pas être utilisée.

En outre, il devient difficile de rechercher la cause de la raison pour laquelle les données à l'origine de l'erreur se sont produites si toutes les données ont été effacées.

Pour les raisons évoquées ci-dessus, «l'effacement de toutes les données» ne doit vraiment être laissé qu'en dernier recours, et autant de recherches et d'actions que possible doivent être menées avant d'effacer les données.

Je prendrais les remèdes suivants.

Recherchez la cause du défaut et déterminez si les données sont anormales ou non.

Tout d'abord, déterminez la cause du problème. Dans cet article, il semble que la cause soit que «post.user» soit «nul».

https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_688029_480b986b-36d4-66fd-60a6-7f1dcef94075.png

Déterminez ensuite si la condition est raisonnable. Lorsque «post.user» est «nil», cela signifie qu'aucun contributeur n'est associé à la publication. D'un point de vue commun, je pense que c'est une situation improbable (= données anormales).

Rechercher la cause de l'erreur de données et corriger le code si nécessaire (prévention de récidive)

Ensuite, pensez à la cause: "Pourquoi un message sans affiche est-il sorti?" Si vous ne trouvez pas la cause, même si vous recréez la base de données et n'obtenez aucune erreur, après un certain temps, «messages sans affiches» peut réapparaître.

Si vous utilisez normalement l'écran et que vous pouvez publier sans poster, c'est un bogue, assurez-vous donc de modifier le code pour que l'affiche soit définie de sorte que le bogue ne se reproduise pas.

Les causes possibles et les remèdes sont énumérés ci-dessous.

ʻOptional: if true` est attaché

Dans les Rails récents, l'enregistrement associé défini par appartient_to est requis par défaut, donc je pense que c'est peu probable, mais s'il a ʻoptional: true, supprimez-le. De cette façon, si vous essayez de sauvegarder un message avec ʻuser in nil, vous obtiendrez une erreur de validation.

app/models/post.rb


 class Post < ApplicationRecord
-  belongs_to :user, optional: true
+  belongs_to :user
 end

Si vous ajoutez plus tard la colonne ʻuser_id` à la table des articles

Ou peut-être que le modèle Post a été créé en premier, puis, quelque temps plus tard, une autre migration a ajouté ʻuser_id` à la table posts. Dans ce cas, après avoir exécuté la migration, il est nécessaire d'associer un enregistrement utilisateur à l'enregistrement Post existant et de le sauvegarder (modifier les données existantes). Si vous oubliez cette correspondance, vous vous retrouverez avec des "messages sans affiches".

Si l'enregistrement utilisateur a été supprimé

La cause la plus probable est peut-être "J'ai supprimé l'enregistrement utilisateur de l'affiche après avoir créé l'enregistrement de publication". dans ce cas,

Une telle méthode d'adaptation peut être envisagée. Les deux premiers peuvent être définis avec l'option «dépendante» de Rails. Consultez les articles suivants pour plus de détails.

Différence entre: depend: restrict \ _with \ _ error et: restrict \ _with \ _exception \ -Qiita

C'est la seule cause qui me vient à l'esprit, mais si je trouve une autre cause (= défaut) que "c'était la cause", je modifierai le programme pour que les "messages sans affiches" ne soient plus créés à l'avenir.

Si des mesures de prévention des récidives sont prises, corriger les données anormales existantes

Une fois que vous avez créé une situation dans laquelle des données étranges ne sont pas créées, il est temps de corriger les données anormales existantes. Par exemple, vous pouvez définir l'affiche pour "Articles sans affiches" en exécutant le script suivant. (Ceci n'est qu'un exemple, veuillez donc modifier le script comme il convient.)

user = User.first
Post.all.each do |post|
  if post.user.nil?
    post.user = user
    post.save!
  end
end

Alternativement, la modification des données telle que la suppression de «messages sans affiches» est également une option.

Post.all.each do |post|
  if post.user.nil?
    post.destroy!
  end
end

En faisant cela, l'affiche sera liée à tous les messages, donc appeler post.user.image_name ne devrait pas provoquer d'erreur.

Si les données ne sont pas anormales, corrigez le code de manière appropriée

Si la situation où "il n'y a pas de contributeur associé à la publication" n'est pas un problème (valable comme spécification), il est nécessaire de séparer le traitement de la vue selon que "post.user" est "nul".

<% if post.user %>
  <%#Traitement lorsqu'il y a une affiche%>
<% else %>
  <%#Traitement lorsqu'il n'y a pas d'affiche%>
<% end %>

Résumé

Si vous le traitez de cette manière, vous n'aurez pas à prendre la mesure d '"effacer toutes les données". Ou plutôt, je pense qu'il est généralement approprié d'adopter cette approche, sauf lorsque vous dites: "Je le fais simplement dans mon environnement local comme passe-temps personnel."

Recommended Posts

[Rails] Je veux tout réinitialiser car les données de l'environnement local sont incorrectes! Que faire avant ça
Que faire lorsque Cloud 9 est plein dans le didacticiel Rails
[Débutant en programmation] Que faire lorsque les rails deviennent une erreur dans l'environnement de développement local
[Rails / ActiveRecord] Je souhaite valider la valeur avant la conversion du type (_before_type_cast)
Que faire à propos de "Un serveur est déjà en cours d'exécution ..." qui s'est produit sans désactiver le serveur de rails dans le terminal
J'ai essayé d'utiliser Docker parce que je ne veux pas polluer l'environnement local dans le développement de l'onglet Microsoft Teams de MS Learn
Tri des données Décroissant, croissant / Rails
Que faire si la page Rails n'est pas affichée dans le didacticiel Rails 1.3.2
L'histoire que j'ai eu du mal parce que je ne pouvais pas faire "Rails db: migrate".
Que faire lorsque vous souhaitez connaître la position source où la méthode est définie dans binding.pry
Après avoir appris Progate, j'ai essayé de créer une application SNS en utilisant Rails dans l'environnement local
[Rails] À propos de l'erreur selon laquelle l'image n'est pas affichée dans l'environnement de production
[Rails] Réinitialisez la base de données dans l'environnement de production
Je souhaite créer l'environnement de développement local le plus solide à l'aide de conteneurs distants VSCode
Androd: Que faire à propos de "Le Royaume est déjà dans une transaction d'écriture dans"
J'ai essayé d'organiser la session en Rails
Je veux obtenir la valeur en Ruby
Que faire lorsque «Impossible de trouver» dans l’une des sources apparaît dans l’environnement de développement avec Docker × Rails × RSpec
Même si je souhaite convertir le contenu d'un objet de données en JSON en Java, il existe une référence circulaire ...
Comment installer Docker dans l'environnement local d'une application Rails existante [Rails 6 / MySQL 8]
Pour ceux qui souhaitent utiliser MySQL pour la base de données dans la construction de l'environnement de Rails6 ~.
[Rails] Comment supprimer les données MySQL de l'environnement de production après les avoir placées dans l'environnement de développement
Que faire lorsque «Échec du chargement de la bibliothèque partagée JNI» s'affiche dans Eclipse
Que faire lorsque l'adresse déjà utilisée est affichée après l'exécution des rails
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
Que faire si le serveur Rails ne peut pas démarrer
Je veux faire quelque chose comme "cls" en Java
Je veux intégrer n'importe quel TraceId dans le journal
Je veux utiliser une petite icône dans Rails
Que dois-je faire pour recharger le Dockerfile mis à jour?
Je souhaite définir une fonction dans la console Rails
Notez que je suis tombé sur la construction de l'environnement Rails
SSL dans l'environnement local de Docker / Rails / puma
[Maven] Que faire si on vous demande d’incorporer dans la guerre un fichier jar qui n’est pas dans le référentiel distant
[Rails] Que faire lorsque les rails db: migrate ne peuvent pas être effectués car aucune table n'est référencée par la clé externe
Après avoir publié un article avec Rails Simple Calendar, je souhaite le refléter dans le calendrier.
[Tutoriel Rails Chapitre 2] Que faire lorsque vous faites une erreur dans le nom de la colonne
J'ai essayé de développer la fonction de cache d'Application Container Cloud Service dans l'environnement local
Je veux recréer le contenu des actifs à partir de zéro dans l'environnement construit avec capistrano
[Rails] Que faire lorsque la vue se réduit lorsqu'un message est affiché avec la méthode des erreurs
[Rails] [bootstrap] Je souhaite modifier la taille de la police de manière réactive
Je souhaite créer un formulaire pour sélectionner la catégorie [Rails]
Je souhaite passer au même écran dans l'état enregistré
Que faire si la commande rails devient inutilisable
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
[Rails] Que faire lorsque l'erreur Aucune base de données sélectionnée et Base de données inconnue apparaît dans db: migrate
[Java] Je veux vérifier que les éléments de la liste sont nuls ou vides [Collection Utils]
Que faire si l'application n'est pas créée avec la dernière version de Rails installée lorsque les rails sont neufs
Je souhaite importer les éléments du menu déroulant lors de la soumission d'un formulaire dans Rails en CSV et les afficher à partir des données de la base de données.
[Ubuntu 20.04] Que faire si le moniteur externe n'est pas reconnu
L'histoire de Collectors.groupingBy que je veux garder pour la postérité