2013-09-27 2 views
0

J'ai effacé accidentellement tous les enregistrements d'un modèle.Rails destroy_all undo

Model.destroy_all 

Pour la sortie, j'ai reçu une grande liste pour tous les enregistrements qui ont été détruits.

=> [#<Model id: 1, some_attribute: "Hello World">, #<Model id: 2, some_attribute: " Hello World 2">, etc etc etc] 

Mais, j'ai un texte. Puis-je faire quelque chose, en utilisant IRB, pour renvoyer les enregistrements?

Ceci est très, très urgent! Toute aide est appréciée.

Merci beaucoup

Répondre

2

Le script suivant devrait faire l'affaire:

require 'bigdecimal' 

str = "#<Model id: 1, some_attribute: #<BigDecimal:4ba0730,'0.0',9(18)>, another_attribute: \"Hello World\">, #<Model id: 2, some_attribute: \" Hello World 2\">" 

str.scan(/#?<(\w+) (.+?)>(?=, #|$)/) do |m| 
    model = Object.const_get(m[0]) 
    m[1].gsub!(/#<BigDecimal:.+?('.+?').+?>/, "BigDecimal.new(\\1)") 
    eval("model.create(#{m[1]})") 
end 

Ce gère également les cas de BigDecimal. Dans le cas où vous avez besoin de gérer d'autres types spéciaux, vous pouvez simplement ajouter un autre appel à gsub!.

+0

Merci pour votre réponse! Comment puis-je améliorer mon deuxième groupe de capture si j'ai un "# Dmitri

+0

Merci! Cela fait très bien l'affaire! À votre santé! :) – Dmitri

+0

Attention avec les guillemets doubles, j'ai eu un problème en incluant des dates dans le mien, datetime avait des guillemets en eux, mais en faisant 'str = 'blah'' il a semblé fonctionner –

2

est ici un test rapide que j'ai fait sur mon modèle:

1. pry(main)> output = JobUser.first(10).to_s

=> "[#<JobUser id: 10001, instagram_user_id: 297705889, job_id: 2, invited: true, created_at: \"2013-09-23 21:53:37\", updated_at: \"2013-09-23 21:53:37\">, #<JobUser id: 10002, instagram_user_id: 36823356, job_id: 2, invited: true, created_at: \"2013-09-23 21:53:37\", updated_at: \"2013-09-23 21:53:37\">, #<JobUser id: 10003, instagram_user_id: 509682835, job_id: 2, invited: true, created_at: \"2013-09-23 21:53:37\", updated_at: \"2013-09-23 21:53:37\"> .... 

2.

parsed = output.gsub('#<', '').gsub('>', '').gsub(/^\[/, '').gsub(/\]$/, '').split('JobUser').map(&:strip)

=>

 "id: 10001, instagram_user_id: 297705889, job_id: 2, invited: true, created_at: \"2013-09-23 21:53:37\", updated_at: \"2013-09-23 21:53:37\",", 
    "id: 10002, instagram_user_id: 36823356, job_id: 2, invited: true, created_at: \"2013-09-23 21:53:37\", updated_at: \"2013-09-23 21:53:37\",", 
    "id: 10003, instagram_user_id: 509682835, job_id: 2, invited: true, created_at: \"2013-09-23 21:53:37\", updated_at: \"2013-09-23 21:53:37\"... 

3. parsed.shift parce que le premier élément de tableau sera une chaîne vide

4. records = parsed.map { |serialized_record| JobUser.new(eval "{ #{serialized_record} }") }

alors vous devriez probablement exécuter quelque chose comme records.each { |record| record.save }

S'il vous plaît noter que vous devrait remplacer JobUser avec le nom de votre modèle. Le point est que vous devrez analyser la chaîne et l'insérer dans la base de données

bonne chance!

+0

Merci beaucoup pour votre réponse! Je vais essayer tout de suite – Dmitri

+0

Pouvez-vous suggérer ce que je devrais faire si j'ai une entrée de colonne BigDecimal? En raison de cela, j'ai une erreur à l'étape 4: "erreur de syntaxe, inattendu tLABEL" Ai-je besoin d'analyser en quelque sorte? Merci – Dmitri

Questions connexes