0

我不小心从我的一个模型中删除了所有记录。

Model.destroy_all

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

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

但是,我有一个文本。我可以做任何事情,使用 IRB 来返回记录吗?

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

太感谢了

4

2 回答 2

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为您的型号名称。关键是您必须解析字符串并将其插入数据库

祝你好运!

于 2013-09-27T11:44:16.177 回答
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!.

于 2013-09-27T11:52:48.363 回答