2013-09-27 81 views
0

我不小心擦除了我的模型中的所有记录。Rails destroy_all undo

Model.destroy_all 

对于输出,我收到了所有已销毁记录的大型列表。

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

但是,我知道它的文字。 我可以做任何事情,使用IRB将记录返回给我?

这是非常非常紧急!任何帮助表示赞赏。

谢谢你这么多

回答

2

下面的脚本应该做的伎俩:

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 

这也处理BigDecimal的实例。如果您需要处理其他特殊类型,您可以添加另一个电话gsub!

+0

谢谢你的回答! 如果我为模型属性之一添加了“# Dmitri

+0

谢谢!这非常好!干杯! :) – Dmitri

+0

小心用双引号,我在包含日期的时候遇到了问题,日期时间里有双引号,但是通过执行'str ='blah''好像有效 –

2

这里有一个快速的测试,我在我的模型制作:

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因为在数组的第一个元素将是一个空字符串

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

那么你或许应该运行类似records.each { |record| record.save }

请注意,您应该用您的型号名称替换JobUser。 关键是你必须解析字符串并将其插回到数据库中

祝你好运!

+0

非常感谢您的回复!我要马上试试 – Dmitri

+0

你可以建议如果我有BigDecimal列条目该怎么办? 因为它,我在步骤4有一个错误:“语法错误,意外的tLABEL” 我需要解析它吗?谢谢 – Dmitri