Использовать before_destroy для удаления записи другой модели?

#ruby-on-rails #ruby-on-rails-3 #destroy

#ruby-на-рельсах #ruby-on-rails-3 #уничтожить

Вопрос:

Итак, у меня есть модель, назовем ее Notes. В заметках вы можете разместить только несколько сообщений. Таким образом, модель notes имеет строку:

  has_many :posts
 

И в модели posts есть строка

  belongs_to :note
 

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

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

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

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

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

Ответ №1:

вы можете вернуть 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. Naveed я думаю, вы имели в виду поднять «Не могу удалить …» вместо rails «Не могу удалить …»

Ответ №2:

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

 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), остальные ваши обратные вызовы выполняться не будут.

Комментарии:

1. Кроме того, фактическая ошибка была бы полезна. Возможно, ваш код работает, но что-то еще вызывает ошибку «Незаконная инструкция».