Ich werde das Skript hier teilen. Beachte bitte, dass ich nicht sicher bin, ob dies der beste Ansatz für das Problem ist. Das Skript muss nachdem doppelte Themen aufgrund der Domainnamen-Änderung erstellt wurden, ausgeführt werden. Da die Themen erst erstellt werden, wenn Benutzer deine Blogbeiträge an der neuen Domain besuchen, musst du das Skript wahrscheinlich mehrmals ausführen, um alle Themen zu erfassen. Ersetze unbedingt old.domain.com in der ersten Zeile des Skripts durch die tatsächliche Domain, unter der dein Blog früher erreichbar war.
# Führe dies zuerst aus:
original_embeds = TopicEmbed.where("embed_url LIKE ?", "%old.domain.com%")
# Dann:
original_embeds.each do |original_embed|
original_topic = Topic.find(original_embed.topic_id)
if (original_topic && original_topic.title)
possible_dups = Topic.where(title: original_topic.title).order(:created_at)
if possible_dups.length === 2
new_embed = TopicEmbed.find_by(topic_id: possible_dups.last.id)
new_embed_url = new_embed.embed_url
puts "Destroying TopicEmbed: #{new_embed.id} Topic: #{new_embed.topic_id}"
new_embed.destroy
puts "Updating TopicEmbed: #{original_embed.id} New embed_url: #{new_embed_url}"
original_embed.update(embed_url: new_embed_url)
end
end
end
Um das Skript auszuführen, öffne die Rails-Konsole deiner Website, kopiere die erste Zeile des Skripts in die Konsole und führe sie aus. Dadurch wird die Variable original_embeds mit einem Array von TopicEmbed-Datensätzen gefüllt. Sobald dies erledigt ist, kannst du den Rest des Skripts in die Konsole kopieren und ausführen.
Zur Sicherheit solltest du vor der Ausführung des Skripts ein Backup der Datenbank deiner Website erstellen. Es wäre auch ratsam, eine Testausführung (Dry Run) des Skripts durchzuführen, die keine Änderungen vornimmt. Das folgende Skript eignet sich dafür:
original_embeds.each do |original_embed|
original_topic = Topic.find(original_embed.topic_id)
if (original_topic && original_topic.title)
possible_dups = Topic.where(title: original_topic.title).order(:created_at)
if possible_dups.length === 2
new_embed = TopicEmbed.find_by(topic_id: possible_dups.last.id)
new_embed_url = new_embed.embed_url
puts "(Dry run) Destroying TopicEmbed: #{new_embed.id} Topic: #{new_embed.topic_id}"
#new_embed.destroy
puts "(Dry run) Updating TopicEmbed: #{original_embed.id} New embed_url: #{new_embed_url}"
#original_embed.update(embed_url: new_embed_url)
end
end
end
Stelle sicher, dass die Ausgabe plausibel erscheint, bevor du die Zeilen, die tatsächliche Änderungen an der Datenbank vornehmen, wieder aktivierst (auskommentierst).
Was das Skript tut:
-
Die Variable original_embeds wird mit allen TopicEmbed-Datensätzen gefüllt, die mit der alten Domain deines Blogs übereinstimmen.
-
Für jeden dieser original_embeds wird versucht, ein Thema mit einem doppelten Titel (das neue doppelte Embed) zu finden.
-
Wenn ein doppeltes Thema gefunden wird und ein TopicEmbed-Datensatz für dieses doppelte Thema existiert, wird dieser TopicEmbed-Datensatz gelöscht und der Wert seiner embed_url-Eigenschaft auf den alten TopicEmbed-Datensatz übertragen.
Ich würde dringend empfehlen, vor der Ausführung des Skripts, das tatsächliche Änderungen vornimmt, eine Testausführung (mit dem zweiten Skript aus diesem Beitrag) durchzuführen. Falls bei der Testausführung Fehler auftreten, musst du die Ursache dafür ermitteln. Beim aktuellen Code sehe ich ein mögliches Problem, das auftreten könnte, wenn auf deiner Discourse-Seite ein Thema mit einem doppelten Titel zu einem eingebetteten Thema existiert, aber kein zugehöriger TopicEmbed-Datensatz vorhanden ist. Falls dies der Fall ist, lässt sich dies beheben.