2011-10-28 26 views
2

所以我有一個模型,我們稱之爲Notes。在筆記上,你可以但是有幾個帖子。所以筆記模型行:使用before_destroy刪除另一個模型的條目?

has_many :posts 

和支柱模型行

belongs_to :note 

現在,當用戶銷燬後,我要爲被破壞,如果它不再說明有任何其他職位。

我以爲我會寫這樣的代碼,進入後模型before_destroy:

def delete_note_if_last_post 
    if self.note.posts.count == 1 
     self.note.destroy 
    end 
    end 

這是行不通的。它根據「非法指令」關閉服務器。有什麼方法可以完成我想要做的事情嗎?

編輯:改變了代碼,因爲我注意到一個錯誤,現在問題有所不同。

回答

4

可以返回false,以防止破壞的模型before_destroy過濾

before_destroy :has_no_post 

然後在has_no_post

def has_no_post 
#You can prevent this from deletion by using these options 
#Option1 return false on certain condition 
return false if posts.any? 

#or add an error to errors 
errors << "Can not delete note if it has post" if posts.any? 
#raise an exception 
raise "Cant delete ..." if blah blah 

+0

有了這個,你也將防止帖子被銷燬... – Elmatou

+1

Naveed我認爲你的意思是提高「不能刪除...」而不是軌道「不能刪除...」 –

+0

是的,謝謝,你應該改正錯別字! – Naveed

1

我會建議把這種邏輯放入觀察者中。類似於

class PostObserver < ActiveRecord::Observer 
    def after_destroy(post) 
    note = Note.find(post.note_id) 
    note.destroy if note.posts.count == 0 
    end 
end 

您必須在config/application.rb文件中註冊觀察者。需要注意的一件事是,如果您的回調函數返回任何可以評估爲false的值(例如nil或false),則其餘的回調函數將不會運行。

+0

而且,實際的錯誤將是有益的。這可能是你的代碼工作,但其他的東西導致'非法指令'的錯誤。 – dogenpunk