无论如何撤消rails控制台中的activerecord删除?

Phi*_*l R 22 ruby-on-rails rails-activerecord

我在脚本/控制台中犯了一个令人难以置信的可怕错误:

user.delete
Run Code Online (Sandbox Code Playgroud)

有没有办法在同一个脚本/控制台会话中撤消它?

Arn*_* L. 22

好吧,如果你仍然可以访问已删除的记录,你可以创建一个这样的新副本

User.new(user.attributes_hash).save
Run Code Online (Sandbox Code Playgroud)

这将只创建一个具有exaxt相同属性的用户(是的,也是id)并将其保存到DB.我使用它来使用闪光灯撤消破坏动作.

警告.如果您已使用该User#destroy方法并且您的模型与dependent: :destroy或有关系dependent: :delete,则那些相关记录(如果在执行命令时存在)将丢失.当然,除非您对已删除/已销毁的记录有活动引用,即变量.

  • 在Rails 5+中,它将是`User.new(user.attributes).save`. (7认同)

wpp*_*wpp 19

我也不知道某种方式,您可能仍然拥有shell历史记录中的信息.(向上滚动直到你执行user.delete).您可以手动还原用户实例,如果您有依赖关系/关联,这会变得棘手.

对于未来:您可能希望通过以下方式在沙箱模式下启动控制台:

rails console -s
Run Code Online (Sandbox Code Playgroud)

关闭后,所有更改都将回滚.

编辑:请看看Arne L.的答案,如果对象仍然可用,它会显示一种将用户保存到数据库的方法.这比我提出的要好得多("手动恢复用户").


jba*_*ket 4

很不幸的是,不行。除非您使用像 Papertrail 这样的宝石来保存您的更改历史,否则记录就会消失。

  • save 没有帮助,但这似乎已经成功了: `user2 = user.clone` `user2.id = user.id` `user2.save(false)` (5认同)