2013-09-27 29 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