Проверьте, была ли только что уничтожена запись в рельсах
Итак, существует
record.new_record?
Чтобы проверить, что что-то новое
Мне нужно проверить, нет ли на этом пути.
record = some_magic
record.destroy
record.is_destroyed? # => true
Что-то вроде этого. Я знаю, что уничтожение замерзает объект, поэтому он заморожен? вроде работ, но есть ли что-то явно для этой задачи?
Ответы
Ответ 1
Вы можете сделать это.
Record.exists?(record)
Однако это приведет к удару по базе данных, которая не нужна. Единственное другое решение, которое я знаю, это сделать обратный вызов, как указано в нем.
attr_accessor :destroyed
after_destroy :mark_as_destroyed
def mark_as_destroyed
self.destroyed = true
end
И затем проверьте record.destroyed
.
Ответ 2
Просто сделайте это:
record.destroyed?
Подробности здесь ActiveRecord:: Persistence
Ответ 3
Это очень скоро. В последнем сообщении Riding Rails говорится следующее:
И, наконец, это не обязательно BugMash, но Хосе Валим - среди десятков других коммитов - добавлено model.destroyed?. Этот отличный способ вернет true, только если экземпляр вы сейчас смотрите на успешно уничтожен.
Итак, вы идете. Скоро!
Ответ 4
destroy
объект не возвращает ничего, кроме вызова freeze
(насколько мне известно), поэтому я думаю, что frozen?
- ваш лучший выбор. Другой вариант - спасти от ActiveRecord::RecordNotFound
, если вы сделали что-то вроде record.reload
.
Я думаю, что тактика Майка выше могла бы быть лучше, или вы могли бы написать обертку для упомянутых случаев, если вы хотите начать "делать предположения".
Приветствия.
Ответ 5
Пока record.destroyed? работает нормально и возвращает true или false, вы также можете немного уменьшить это значение и создать условие if на строке, которую вы вызываете, уничтожить в контроллере.
record = Object.find(params[:id])
if record.destroy
... happy path
else
... sad path
end
Реализовать этот пост немного поздно в игре. Но если кто-то захочет обсудить это больше, я играю!
Боковое замечание: у меня также была проверка на after_destroy на моей модели, и хотя она работала, отдельный метод для чего-то вроде этого кажется излишним;)
Ответ 6
Не зная больше логики вашего приложения, я думаю, что он заморожен? это ваш лучший выбор.
В противном случае вы можете добавить атрибут "destroy" к вашим моделям, которые вы вызываете в обратных вызовах, и которые можно проверить, если вы хотите получить более точное решение.