#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. Кроме того, фактическая ошибка была бы полезна. Возможно, ваш код работает, но что-то еще вызывает ошибку «Незаконная инструкция».