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.
(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.
Ermitteln Sie zunächst die Ursache des Problems. In diesem Artikel scheint die Ursache darin zu liegen, dass "post.user" "null" ist.
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).
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.
optional: true
angehängt istIn 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
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".
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.
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.
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 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 %>
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