[RUBY] [Rails] Ich möchte alles zurücksetzen, weil die Daten in der lokalen Umgebung falsch sind! Was ist vorher zu tun?

Einführung

Ich habe den folgenden Qiita-Artikel gesehen.

Die Idee, das Original abzuschneiden, wenn der Fehler nicht behoben ist \ -Qiita

Ich möchte, dass Sie den obigen Artikel für Details lesen, aber in einer kurzen Zusammenfassung: "Wenn die Daten in der lokalen Umgebung merkwürdig werden, erstellen wir die Datenbank neu (nachdem Sie bestätigt haben, dass das Löschen der Daten in Ordnung ist)." ist.

Ich persönlich dachte jedoch: "Nun, es ist nicht so gut", also beschloss ich, einen Antwortkommentar zu schreiben. Als ich anfing, Kommentare zu schreiben, wurde es ziemlich lang und ich beschloss, daraus einen unabhängigen Artikel zu machen. Das ist dieser Artikel.

Deshalb möchte ich alles zurücksetzen, weil die Daten in der lokalen Umgebung seltsam sind! Folgendes müssen Sie tun, bevor Sie nachdenken.

Ich möchte alles zurücksetzen, weil die Daten in der lokalen Umgebung seltsam sind! Was ist vorher zu tun?

(Hinweis: Der folgende Inhalt wurde ursprünglich als Antwortkommentar zu [Qiita-Artikel am Anfang] geschrieben (https://qiita.com/TeppeiMimachi/items/755639c775c72cb73ad9). Bitte lesen Sie diese Annahme weiter.)

Das Zurücksetzen der Datenbank ist wirksam, wenn "alle Daten gelöscht werden können", kann jedoch nicht anderweitig verwendet werden. Als persönliches Hobby entwickelte Rails-Apps mögen in Ordnung sein, aber obwohl sich die bei der Arbeit entwickelten Rails-Apps in einer lokalen Umgebung befinden, enthalten sie häufig viele "Testdaten, die ich häufig verwendet habe". Es bedeutet: "Ich kann das alles nicht löschen." Wenn das gleiche Problem in der Produktionsumgebung anstelle der Entwicklungsumgebung auftritt, kann die Strategie "Alle Daten löschen" nicht verwendet werden.

Darüber hinaus wird es schwierig, die Ursache dafür zu untersuchen, warum die Daten, die den Fehler verursacht haben, aufgetreten sind, wenn alle Daten gelöscht wurden.

Aus den oben genannten Gründen sollte das "Löschen aller Daten" als letztes Mittel belassen werden, und vor dem Löschen der Daten sollten so viele Untersuchungen und Maßnahmen wie möglich durchgeführt werden.

Ich würde die folgenden Mittel nehmen.

Untersuchen Sie die Ursache des Fehlers und stellen Sie fest, ob die Daten abnormal sind oder nicht.

Ermitteln Sie zunächst die Ursache des Problems. In diesem Artikel scheint die Ursache darin zu liegen, dass "post.user" "null" ist.

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

Stellen Sie dann fest, ob die Bedingung angemessen ist. Wenn post.user`` nil ist, bedeutet dies, dass dem Beitrag kein Mitwirkender zugeordnet ist. Aus allgemeiner Sicht halte ich dies für eine unwahrscheinliche Situation (= abnormale Daten).

Finden Sie die Ursache des Datenfehlers heraus und korrigieren Sie gegebenenfalls den Code (Verhinderung eines erneuten Auftretens).

Denken Sie dann über die Ursache nach: "Warum ist ein Beitrag ohne Poster herausgekommen?" Wenn Sie die Ursache nicht finden, werden nach einer Weile möglicherweise wieder "Beiträge ohne Poster" angezeigt, auch wenn Sie die Datenbank neu erstellen und keine Fehlermeldung erhalten.

Wenn Sie den Bildschirm normalerweise bedienen und ohne Poster posten können, handelt es sich um einen Fehler. Ändern Sie daher den Code so, dass das Poster so eingestellt ist, dass der Fehler nicht erneut auftritt.

Die möglichen Ursachen und Abhilfemaßnahmen sind unten aufgeführt.

Wenn optional: true angehängt ist

In den letzten Rails ist der zugehörige Datensatz, der durch "Gehört zu" definiert ist, standardmäßig erforderlich, daher halte ich dies für unwahrscheinlich. Wenn jedoch "Optional: Wahr" angehängt ist, entfernen Sie ihn. Auf diese Weise erhalten Sie einen Validierungsfehler, wenn Sie versuchen, einen Beitrag mit "user" in "nil" zu speichern.

app/models/post.rb


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

Wenn Sie später die Spalte "user_id" zur Posts-Tabelle hinzufügen

Oder vielleicht wurde das Post-Modell zuerst erstellt, und einige Zeit später fügte eine andere Migration die "user_id" zur Posts-Tabelle hinzu. In diesem Fall ist es nach Ausführung der Migration erforderlich, einen Benutzerdatensatz mit dem vorhandenen Post-Datensatz zu verknüpfen und zu speichern (vorhandene Daten ändern). Wenn Sie diese Korrespondenz vergessen, erhalten Sie "Beiträge ohne Poster".

Wenn der Benutzerdatensatz gelöscht wurde

Die wahrscheinlichste Ursache ist "Ich habe den Benutzerdatensatz des Posters nach dem Erstellen des Post-Datensatzes gelöscht". in diesem Fall,

Ein solches Bewältigungsverfahren kann in Betracht gezogen werden. Die ersten beiden können mit der Option "abhängig" von Rails eingestellt werden. Weitere Informationen finden Sie in den folgenden Artikeln.

Unterschied zwischen: abhängig: \ _mit \ _ Fehler einschränken und: \ _mit \ _Ausnahme \ -Qiita einschränken

Dies ist die einzige Ursache, die mir sofort in den Sinn kommt. Wenn ich jedoch eine andere Ursache (= Fehler) finde, dass "dies die Ursache war", werde ich das Programm so ändern, dass "Beiträge ohne Poster" in Zukunft nicht mehr erstellt werden.

Wenn Maßnahmen zur Verhinderung von Rezidiven ergriffen werden, korrigieren Sie vorhandene abnormale Daten

Sobald Sie eine Situation erstellt haben, in der keine seltsamen Daten erstellt wurden, ist es Zeit, die vorhandenen anomalen Daten zu beheben. Sie können beispielsweise das Poster für "Posts ohne Poster" festlegen, indem Sie das folgende Skript ausführen. (Dies ist nur ein Beispiel. Ändern Sie daher das Skript entsprechend.)

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

Alternativ können Sie die Daten auch ändern, indem Sie "Beiträge ohne Poster" löschen.

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

Auf diese Weise wird das Poster mit allen Posts verknüpft, sodass das Aufrufen von "post.user.image_name" keinen Fehler verursachen sollte.

Wenn die Daten nicht abnormal sind, korrigieren Sie den Code entsprechend

Wenn die Situation, dass "dem Beitrag kein Mitwirkender zugeordnet ist", kein Problem darstellt (gültig als Spezifikation), muss die Ansichtsverarbeitung abhängig davon getrennt werden, ob "post.user" "null" ist.

<% if post.user %>
  <%#Verarbeitung, wenn ein Poster vorhanden ist%>
<% else %>
  <%#Verarbeitung, wenn kein Poster vorhanden ist%>
<% end %>

Zusammenfassung

Wenn Sie auf diese Weise damit umgehen, müssen Sie nicht das Maß "Löschen aller Daten" ergreifen. Oder besser gesagt, ich denke, es ist normalerweise angemessen, diesen Ansatz zu wählen, außer wenn Sie sagen: "Ich mache es nur in meiner lokalen Umgebung als persönliches Hobby."

Recommended Posts

[Rails] Ich möchte alles zurücksetzen, weil die Daten in der lokalen Umgebung falsch sind! Was ist vorher zu tun?
Was tun, wenn Cloud 9 im Rails-Lernprogramm voll ist?
[Programmieranfänger] Was tun, wenn Schienen zu einem Fehler in der lokalen Entwicklungsumgebung werden?
[Rails / ActiveRecord] Ich möchte den Wert überprüfen, bevor der Typ konvertiert wird (_before_type_cast).
Was tun gegen "Ein Server läuft bereits ...", ohne dass der Rails-Server im Terminal ausgeschaltet wurde
Ich habe versucht, Docker zu verwenden, weil ich die lokale Umgebung bei der Entwicklung der Registerkarte "Microsoft Teams" von MS Learn nicht verschmutzen möchte
Daten sortieren Absteigend, aufsteigend / Schienen
Was tun, wenn die Rails-Seite im Rails-Lernprogramm 1.3.2 nicht angezeigt wird?
Die Geschichte, mit der ich zu kämpfen hatte, weil ich "Rails db: migrate" nicht machen konnte.
Was tun, wenn Sie die Quellposition wissen möchten, an der die Methode in bind.pry definiert ist?
Nachdem ich Progate gelernt hatte, versuchte ich, eine SNS-Anwendung mit Rails in der lokalen Umgebung zu erstellen
[Schienen] Über den Fehler, dass das Bild nicht in der Produktionsumgebung angezeigt wird
[Rails] Setzen Sie die Datenbank in der Produktionsumgebung zurück
Ich möchte die stärkste lokale Entwicklungsumgebung mit VSCode Remote Containers erstellen
Androd: Was tun gegen "The Realm befindet sich bereits in einer Schreibtransaktion in"
Ich habe versucht, die Sitzung in Rails zu organisieren
Ich möchte den Wert in Ruby erhalten
Was ist zu tun, wenn in einer der Quellen in der Entwicklungsumgebung mit Docker × Rails × RSpec "Nicht gefunden" angezeigt wird?
Auch wenn ich den Inhalt eines Datenobjekts in Java in JSON konvertieren möchte, gibt es einen Zirkelverweis ...
So installieren Sie Docker in der lokalen Umgebung einer vorhandenen Rails-App [Rails 6 / MySQL 8]
Für diejenigen, die MySQL für die Datenbank in der Umgebungskonstruktion von Rails6 ~ verwenden möchten.
[Rails] So löschen Sie MySQL-Daten aus der Produktionsumgebung, nachdem Sie sie in die Entwicklungsumgebung gestellt haben
Was ist zu tun, wenn in Eclipse "Fehler beim Laden der gemeinsam genutzten JNI-Bibliothek" angezeigt wird?
Was tun, wenn die bereits verwendete Adresse nach dem Ausführen der Schienen angezeigt wird?
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
Was tun, wenn der Rails-Server nicht gestartet werden kann?
Ich möchte so etwas wie "cls" in Java machen
Ich möchte eine TraceId in das Protokoll einbetten
Ich möchte ein kleines Symbol in Rails verwenden
Was muss ich tun, um die aktualisierte Docker-Datei neu zu laden?
Ich möchte eine Funktion in der Rails Console definieren
Beachten Sie, dass ich beim Erstellen der Rails-Umgebung gestolpert bin
SSL in der lokalen Umgebung von Docker / Rails / Puma
[Maven] Was tun, wenn Sie aufgefordert werden, ein Glas, das sich nicht im Remote-Repository befindet, in den Krieg aufzunehmen?
[Rails] Was ist zu tun, wenn Rails db: migrate nicht ausgeführt werden kann, da keine Tabelle vorhanden ist, auf die der externe Schlüssel verweist?
Nachdem ich einen Artikel mit Rails Simple Calendar veröffentlicht habe, möchte ich ihn im Kalender wiedergeben.
[Rails Tutorial Kapitel 2] Was tun, wenn Sie einen Fehlern im Spaltennamen machen?
Ich habe versucht, die Cache-Funktion von Application Container Cloud Service in der lokalen Umgebung zu entwickeln
Ich möchte den Inhalt von Assets in der mit capistrano erstellten Umgebung von Grund auf neu erstellen
[Schienen] Was tun, wenn die Ansicht zusammenbricht, wenn eine Nachricht mit der Fehlermethode angezeigt wird?
[Rails] [Bootstrap] Ich möchte die Schriftgröße entsprechend ändern
Ich möchte ein Formular erstellen, um die Kategorie [Schienen] auszuwählen
Ich möchte im gespeicherten Zustand zum selben Bildschirm wechseln
Was tun, wenn der Befehl Rails unbrauchbar wird?
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
[Rails] Was tun, wenn der Fehler Keine Datenbank ausgewählt und Unbekannte Datenbank in db: migrate angezeigt wird?
[Java] Ich möchte überprüfen, ob die Elemente in der Liste null oder leer sind. [Collection Utils]
Was tun, wenn die App nicht mit der neuesten Rails-Version erstellt wurde, die bei neuen Rails installiert wurde?
Ich möchte die Pulldown-Menüelemente beim Senden eines Formulars in Rails in CSV importieren und aus den DB-Daten anzeigen.
[Ubuntu 20.04] Was tun, wenn der externe Monitor nicht erkannt wird?
Die Geschichte von Collectors.groupingBy, die ich für die Nachwelt behalten möchte