Использовать before_destroy, чтобы удалить запись другой модели? - PullRequest
2 голосов
/ 28 октября 2011

Итак, у меня есть модель, назовем ее Notes.На заметках можно только несколько постов.Таким образом, модель заметок имеет строку:

 has_many :posts

А модель записей имеет строку

 belongs_to :note

Теперь, когда пользователь удаляет запись, я хочу, чтобы заметка была уничтоженаЕсли у него больше нет других постов.

Я думал, что напишу этот код в модель поста с before_destroy:

 def delete_note_if_last_post
    if self.note.posts.count == 1
      self.note.destroy
    end
  end

Это не работает.Он отключает сервер на основании «Незаконной инструкции».Есть ли какой-нибудь способ выполнить то, что я пытаюсь сделать?

РЕДАКТИРОВАТЬ: изменил код, так как я заметил ошибку, и теперь проблема немного отличается.

Ответы [ 2 ]

4 голосов
/ 28 октября 2011

вы можете вернуть 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

end

1 голос
/ 28 октября 2011

Я бы предложил поместить такую ​​логику в наблюдателя. Что-то вроде

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. Следует отметить, что если ваш обратный вызов возвращает любое значение, которое можно оценить как ложное (например, ноль или ложь), остальные обратные вызовы не будут выполняться.

...