2

所以我有一个模型,我们称之为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

这行不通。它根据“非法指令”关闭服务器。有什么方法可以完成我想做的事情吗?

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

4

2 回答 2

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

结尾

于 2011-10-28T17:20:42.867 回答
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 文件中注册观察者。需要注意的一件事是,如果您的回调返回任何可以评估为假的值(例如 nil 或 false),则其余的回调将不会运行。

于 2011-10-28T16:51:27.780 回答