2009-08-18 80 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驗證,當它工作的時候,一個類似的東西的單獨的方法似乎是矯枉過正;)