所以我有一个模型,我们称之为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
这不起作用。它根据“非法指令”关闭服务器。有没有办法完成我想做的事情?
编辑:更改了代码,因为我注意到了一个错误,现在问题略有不同。
答案 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),则其余的回调将不会运行。