检查记录是否刚刚被破坏


83

所以有

record.new_record?

检查是否有新东西

我需要检查是否有东西出路。

record = some_magic
record.destroy
record.is_destroyed? # => true

这样的事情。我知道销毁会冻结对象,因此冻结吗?这类作品,但是此任务有明确的内容吗?

Answers:


51

你可以这样做。

Record.exists?(record)

但是,这将对数据库造成不必要的损失。我知道的唯一其他解决方案是执行IV所述的回调。

attr_accessor :destroyed
after_destroy :mark_as_destroyed
def mark_as_destroyed
  self.destroyed = true
end

然后检查record.destroyed


2
我认为这里有一些帮助。这取决于您为什么想知道对象是否已被破坏。如果您将其作为单元测试的一部分进行,那么对数据库的额外打击就可以了。如果您将其作为应用程序的一部分进行操作,那么选择第二条路线可能会更好。
jerhinesmith

67
不再需要,使用object.destroyed?
Rob

2
在Rails 4中,DEPRECATION WARNING: You are passing an instance of ActiveRecord::Base to 存在吗?. Please pass the id of the object by calling .id.
Minqi Pan

5
Record.exists?控制器规格中仍然需要,因为我无法重新加载销毁的记录来检查它是否为destroyed?。但是,如果我有要检查的实例变量assings,则可以使用destroyed?
denis.peplin '16

@Daniel Huckstep,如果您还活着,请更改正确的答案!
丹尼尔(Daniel)


11

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

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

所以你去了。快来了!


6

虽然记录被破坏了?可以正常工作,并且返回true或false,您也可以将其干燥一下,然后在控制器中调用destroy的行上创建if条件。

record = Object.find(params[:id])
if record.destroy
  ... happy path
else
  ... sad path
end

意识到这篇文章在游戏中有点晚了。但是,如果有人想进一步讨论这个问题,我就是游戏!旁注:我还对模型进行了after_destroy验证,并且在模型工作时,针对这种情况的单独方法似乎过分了;)


5

destroyfreeze根据我所知,对一个对象的调用不会返回任何内容(据我所知),所以我认为这frozen?是最好的选择。ActiveRecord::RecordNotFound如果您做了类似的事情,您还可以从中解脱record.reload

我认为上述麦克的策略可能是最好的,或者,如果您想开始“做假设”,则可以为上述情况写一个包装。

干杯。


我目前只是检查是否已冻结?,但实际上我可以加载某些东西并将其冻结以用于其他目的,那么那将是一个谎言……在当前情况下,是否冻结?效果很好,但我不想长期依赖它。
Daniel Huckstep 09年

0

在不了解您的应用程序更多逻辑的情况下,我认为冻结了吗?是您最好的选择。

失败的话,您当然可以在回调中触发的模型中添加“销毁”属性,如果需要更精确的解决方案,可以对其进行检查。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.