2009-08-18 48 views
64

只是摧毁所以有检查记录在轨

record.new_record? 

要检查,如果事情是新

我需要检查,如果事情是它的出路。

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

就是这样的。我知道摧毁冻结对象,所以冻结?有些作品,但有什么明确的任务呢?

回答

40

你可以做到这一点。

Record.exists?(record) 

但是,这将会对数据库造成不必要的影响。我所知道的唯一的另一个解决方案是像上面提到的那样做一个回调。

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

然后检查record.destroyed

+2

我觉得这里有些背景很有帮助。这取决于你想知道对象是否被销毁的原因。如果你将它作为单元测试的一部分,那么对数据库的额外命中就好了。如果您将其作为应用程序的一部分来完成,那么选择第二条路线可能会更好。 – jerhinesmith 2009-10-28 16:57:10

+49

这不再是必要的,使用''object.destroyed – Rob 2011-09-08 16:57:12

+0

http://stackoverflow.com/a/3462595/850996是Rails中4,'弃用警告正确答案 – 2014-09-10 22:06:34

0

不知道更多你的应用程序的逻辑,我认为冻结?是你最好的选择。

如果做不到这一点,你当然可以添加一个“毁”属性,你的模型,你在回调触发并可能对,如果你想更精确的解决方案进行检查。

4

destroy对象不会返回除freeze(据我所知)的调用以外的任何内容,所以我认为frozen?是您最好的选择。如果你做了类似record.reload的事情,你的其他选择是从ActiveRecord::RecordNotFound进行营救。

我认为上述迈克的策略可能是最好的,或者如果你想开始“做假设,”你可以写提到这些案件的包装。

干杯。

+0

我目前只是检查冻结?,但真的我可以加载一些东西,冻结它一些其他的目的,这将是一个谎言然后... 在目前的情况下,冻结?工作正常,但我不想长期依赖它。 – 2009-08-23 07:26:10

10

这很快会来到。在最新的Riding Rails后,就这样说:

最后,它不一定 BugMash相关,但何塞·Valim - 几十个其他的提交中 - 添加 model.destroyed?这个漂亮的方法 只会如果实例 您目前正在观察已 成功摧毁返回true。

所以你去。快来了!

166

只要做到这一点:

record.destroyed? 

详情请看这里ActiveRecord::Persistence

+0

它是ActiveRecord :: Persistence模块的一部分:http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html – 2012-09-07 09:27:31

+0

@Kevin:谢谢!已经更新了我的答案。随着时间流逝,一切都会改变 – Voldy 2012-09-07 09:44:28

4

虽然record.destroyed?做工精细,并且不会返回真或假,你也可以干这个了一点点,创建你叫你的控制器摧毁就行了,如果条件。

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

认识到这篇文章有点晚了。但是,如果有人想讨论这个问题,我就是比赛! 注意:我也对我的模型进行了after_destroy验证,当它工作的时候,一个类似的东西的单独的方法似乎是矫枉过正;)