2009-08-18 2 views
64

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

record.new_record? 

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

мне нужно проверить, если что-то на это выход.

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

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

ответ

40

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

Record.exists?(record) 

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

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

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

+2

Я думаю, что здесь полезен какой-то контекст. Это зависит от того, почему вы хотите узнать, был ли объект уничтожен. Если вы делаете это как часть единичного теста, то дополнительный удар по базе данных прекрасен. Если вы делаете это как часть приложения, то второй вариант может быть лучше. – jerhinesmith

+49

Это больше не нужно, используйте 'object.destroyed?' – Rob

+0

http://stackoverflow.com/a/3462595/850996 - правильный ответ –

0

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

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

4

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

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

Cheers.

+0

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

10

Это очень скоро. В последнем Riding Rails пост, он говорит, что это:

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

Итак, вы идете. Скоро!

166

Просто сделай это:

record.destroyed? 

Подробности здесь ActiveRecord::Persistence

+0

Это часть модуля ActiveRecord :: Persistence: http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html –

+0

@Kevin: Спасибо! Обновил мой ответ. Все меняется с течением времени :) – Voldy

4

Хотя record.destroyed? отлично работает и возвращает true или false, вы также можете немного уменьшить это значение и создать условие if на строке, которую вы вызываете, уничтожить в контроллере.

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

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

Смежные вопросы