使用before_destroy删除另一个模型的条目?

时间:2011-10-28 16:09:04

标签: ruby-on-rails ruby-on-rails-3 destroy

所以我有一个模型,我们称之为Notes。在笔记上,你可以但几个帖子。所以notes模型有一行:

 has_many :posts

帖子模型有行

 belongs_to :note

现在,当用户销毁一个帖子时,如果该帖子不再有任何其他帖子,我希望该笔记被销毁。

我以为我会使用before_destroy:

将此代码编写到post模型中
 def delete_note_if_last_post
    if self.note.posts.count == 1
      self.note.destroy
    end
  end

这不起作用。它根据“非法指令”关闭服务器。有没有办法完成我想做的事情?

编辑:更改了代码,因为我注意到了一个错误,现在问题略有不同。

2 个答案:

答案 0 :(得分: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

结束

答案 1 :(得分: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),则其余的回调将不会运行。