Проверьте, была ли только что уничтожена запись в рельсах

Итак, существует

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