2

だから私はモデルを持っています、それをノーツと呼びましょう。メモでは、いくつかの投稿を行うことができます。したがって、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 ファイルにもオブザーバーを登録する必要があります。注意すべきことの 1 つは、コールバックが false として評価できる値 (nil または false など) を返す場合、残りのコールバックは実行されないことです。

于 2011-10-28T16:51:27.780 に答える