Ruby on rails 使用before#u destroy删除另一个模型';谁的条目?

Ruby on rails 使用before#u destroy删除另一个模型';谁的条目?,ruby-on-rails,ruby-on-rails-3,destroy,Ruby On Rails,Ruby On Rails 3,Destroy,所以我有一个模型,我们称之为笔记。在笔记上,你只能写几篇文章。因此,notes模型有一行: has_many :posts 而posts模型有这样一条线 belongs_to :note 现在,当一个用户销毁一篇帖子时,我希望如果它不再有任何其他帖子,那么这个便笺也会被销毁 我想我会用before_destroy将此代码写入post模型: def delete_note_if_last_post if self.note.posts.count == 1 self.

所以我有一个模型,我们称之为笔记。在笔记上,你只能写几篇文章。因此,notes模型有一行:

 has_many :posts
而posts模型有这样一条线

 belongs_to :note
现在,当一个用户销毁一篇帖子时,我希望如果它不再有任何其他帖子,那么这个便笺也会被销毁

我想我会用before_destroy将此代码写入post模型:

 def delete_note_if_last_post
    if self.note.posts.count == 1
      self.note.destroy
    end
  end
这不管用。它根据“非法指令”关闭服务器。有什么方法可以完成我想做的事情吗


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

我建议将这种逻辑放入观察者中。差不多

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

您还必须在config/application.rb文件中注册观察者。需要注意的一点是,如果您的回调返回任何可以计算为false的值(例如nil或false),那么其余的回调将不会运行。

您可以返回false以防止在销毁前过滤器中销毁模型

before_destroy :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
def没有post
#您可以使用这些选项防止删除此项
#选项1在某些情况下返回false
如果有,返回false?
#或者将错误添加到错误中

此外,实际的错误也会有帮助。这可能是因为您的代码正常工作,但其他原因导致了“非法指令”错误。Naveed我认为您的意思是提高“不能删除…”而不是rails“不能删除…”