【问题标题】:Use before_destroy to delete another model's entry?使用 before_destroy 删除另一个模型的条目?
【发布时间】:2011-10-28 16:09:04
【问题描述】:

所以我有一个模型,我们称之为 Notes。在笔记上,您可以发布几篇文章。所以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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以在 before_destroy 过滤器中返回 false 以防止模型被破坏

    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
    

    结束

    【讨论】:

    • 天真我认为你的意思是提出“不能删除...”而不是轨道“不能删除...”
    【解决方案2】:

    我建议将这种逻辑放入观察者中。类似的东西

    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),则其余的回调将不会运行。

    【讨论】:

    • 另外,实际的错误会有所帮助。可能是您的代码有效,但其他原因导致“非法指令”错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多