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

83

Так что есть

record.new_record?

Чтобы проверить, нет ли чего нового

Мне нужно проверить, не выходит ли что-нибудь.

record = some_magic
record.destroy
record.is_destroyed? # => true

Что-то такое. Я знаю, что уничтожение замораживает объект, так заморожен? вроде работает, но есть ли что-то специально для этой задачи?

Дэниел Хакстеп
источник

Ответы:

50

Ты можешь это сделать.

Record.exists?(record.id)

Однако это нанесет удар по базе данных, что не всегда необходимо. Единственное другое решение, которое я знаю, - это выполнить обратный вызов, как упоминалось в IV.

attr_accessor :destroyed
after_destroy :mark_as_destroyed
def mark_as_destroyed
  self.destroyed = true
end

А потом проверьте record.destroyed.

Райанб
источник
2
Думаю, здесь полезен некоторый контекст. Это зависит от того, почему вы хотите знать, был ли объект уничтожен. Если вы делаете это как часть модульного теста, то дополнительное попадание в базу данных нормально. Если вы делаете это как часть приложения, то лучше выбрать второй путь.
jerhinesmith
69
В этом больше нет необходимости, используйтеobject.destroyed?
Роб
2
в Rails 4 DEPRECATION WARNING: You are passing an instance of ActiveRecord::Base to существует? . Please pass the id of the object by calling .id.
Pan
5
Все еще нужны Record.exists?спецификации контроллера, потому что я не могу перезагрузить уничтоженную запись, чтобы проверить, есть ли это destroyed?. Но если у меня есть переменная экземпляра для проверки assings, я могу использовать destroyed?.
denis.peplin
@Daniel Huckstep, если вы еще живы, поменяйте принятый ответ на правильный!
Daniel
11

Это произойдет очень скоро. В последнем посте Riding Rails говорится следующее:

И, наконец, это не обязательно связано с BugMash, но Хосе Валим - среди десятков других коммитов - добавил model.destroyed ?. Этот изящный метод вернет истину только в том случае, если экземпляр, который вы сейчас смотрите, был успешно уничтожен.

Итак, поехали. Скоро!

Стив Клабник
источник
6

Пока рекорд. Уничтожен? работает нормально и возвращает true или false, вы также можете немного СУШИТЬ это и создать условие if в строке, которую вы вызываете destroy в своем контроллере.

record = Object.find(params[:id])
if record.destroy
  ... happy path
else
  ... sad path
end

Поймите, этот пост немного поздно в игре. Но если кто-то захочет обсудить это подробнее, я играю! Боковое примечание: у меня также была проверка after_destroy на моей модели, и пока она работала, отдельный метод для чего-то вроде этого кажется излишним;)

DGG
источник
5

destroyобъект не возвращает ничего, кроме вызова freeze(насколько я знаю), поэтому я думаю, что frozen?это ваш лучший выбор. Другой вариант - спастись, ActiveRecord::RecordNotFoundесли вы сделали что-то подобное record.reload.

Я думаю, что тактика Майка, описанная выше, могла бы быть лучшей, или вы могли бы написать оболочку для этих упомянутых случаев, если вы хотите начать «делать предположения».

Ура.

theIV
источник
Я сейчас просто проверяю "заморожено" ?, но на самом деле я могу что-то загрузить и заморозить для какой-то другой цели, и тогда это было бы ложью ... В текущей ситуации заморожено? работает нормально, но я не хочу полагаться на него в долгосрочной перспективе.
Дэниел Хакстеп,
0

Не зная больше логики вашего приложения, я думаю, что это заморожено? ваш лучший выбор.

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

Майк Бакби
источник