检查记录是否刚刚在rails中销毁

Dan*_*tep 77 ruby activerecord ruby-on-rails

所以有

record.new_record?
Run Code Online (Sandbox Code Playgroud)

检查某些东西是否是新的

我需要检查是否有东西出来了.

record = some_magic
record.destroy
record.is_destroyed? # => true
Run Code Online (Sandbox Code Playgroud)

这样的事情.我知道毁灭会冻结物体,所以冻结?有点作品,但这个任务有明确的东西吗?

Vol*_*ldy 189

去做就对了:

record.destroyed?
Run Code Online (Sandbox Code Playgroud)

详细信息在这里ActiveRecord :: Persistence


rya*_*anb 50

你可以这样做.

Record.exists?(record)
Run Code Online (Sandbox Code Playgroud)

然而,这将对数据库造成打击,这并非真正必要.我知道的唯一其他解决方案就是像74提到的那样进行回调.

attr_accessor :destroyed
after_destroy :mark_as_destroyed
def mark_as_destroyed
  self.destroyed = true
end
Run Code Online (Sandbox Code Playgroud)

然后检查record.destroyed.

  • 这不再是必需的,使用`object.destroyed?` (61认同)
  • 在控制器规范中仍然需要`Record.exists?`,因为我无法重新加载销毁的记录以检查它是否被"销毁?".但是如果我有实例变量用`assings`检查,那么我可以使用`destroyed?`. (5认同)
  • 我认为一些背景在这里很有帮助.这取决于您想知道对象是否已被销毁的原因.如果你是作为单元测试的一部分,那么对数据库的额外命中就可以了.如果你是作为应用程序的一部分来做,那么走第二条路线可能是更好的选择. (2认同)
  • 在Rails 4中,`DEPRECATION警告:您正在将ActiveRecord :: Base实例传递给`exists?`。请通过调用`.id`。传递对象的ID。 (2认同)

Ste*_*nik 10

这很快就会到来.在最新的Riding Rails帖子中,它说:

最后,它不一定与BugMash相关,但JoséValim - 在其他几十个提交中 - 添加了model.destroyed?.只有当您正在查看的实例已成功销毁时,此nifty方法才会返回true.

你去吧 快来了!


DGG*_*DGG 6

而record.destroyed?工作正常,并返回true或false,你也可以稍微干这个并在控制器中调用destroy的行上创建if条件.

record = Object.find(params[:id])
if record.destroy
  ... happy path
else
  ... sad path
end
Run Code Online (Sandbox Code Playgroud)

认识到这篇文章在游戏中有点晚了.但是,如果有人想讨论这个,我就是游戏!旁注:我的模型上也有一个after_destroy验证,虽然它有效但是像这样的东西的单独方法看起来有点矫枉过正;)


the*_*eIV 5

destroy一个物体除了打电话之外不会返回任何东西freeze(据我所知),所以我认为这frozen?是你最好的选择.ActiveRecord::RecordNotFound如果你做了类似的事情,你的另一个选择是拯救record.reload.

我认为迈克上面的策略可能是最好的,或者如果你想开始"做出假设",你可以为这些提到的案例写一个包装器.

干杯.