Перевірте, чи запис просто не був знищений у рейках


83

Отже є

record.new_record?

Щоб перевірити, чи щось нове

Мені потрібно перевірити, чи щось на цьому виходить.

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

Щось таке. Я знаю, що знищення заморожує об'єкт, такий заморожений? працює, але чи є щось явне для цього завдання?

Відповіді:


51

Ви можете це зробити.

Record.exists?(record)

Однак це зробить потрапляння в базу даних, що насправді не є необхідним. Єдине інше рішення, яке я знаю, - це зробити зворотний дзвінок, як згадував IV.

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

А потім перевірити record.destroyed.


2
Я думаю, що певний контекст тут корисний. Це залежить від того, чому ви хочете знати, чи не було знищено об’єкт. Якщо ви робите це в рамках модульного тесту, тоді додатковий удар по базі даних - це нормально. Якщо ви робите це як частину програми, то краще піти другим маршрутом.
jerhinesmith

68
Це більше не потрібно, використовуйте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.
Minqi Pan

5
Все ще потрібні Record.exists?специфікації контролера, оскільки я не можу перезавантажити знищений запис, щоб перевірити, чи є він destroyed?. Але якщо у мене є змінна екземпляра для перевірки assings, тоді я можу використовувати destroyed?.
denis.peplin

@Daniel Huckstep, якщо ви все ще живі, будь ласка, змініть прийняту відповідь на правильну!
Даніель


11

Це настане дуже скоро. В останньому дописі Riding Rails написано:

І нарешті, це не обов'язково пов'язано з BugMash, але Хосе Валім - серед десятків інших комітів - додав model.destroyed ?. Цей чудовий метод поверне істину лише в тому випадку, якщо екземпляр, який ви зараз переглядаєте, успішно знищений.

Отже. Незабаром!


6

Поки запис. Знищений? працює нормально і повертає true або false, ви також можете трохи СУХИТИ це і створити умову if на рядку, який ви називаєте знищити, у вашому контролері.

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

Зрозумійте, що ця публікація трохи пізня у грі. Але якщо хтось захоче обговорити це більше, я граю! Примітка: У мене також була перевірка after_destroy на моїй моделі, і хоча вона працювала, окремий метод для чогось подібного здається надмірним;)


5

destroyОб’єкт не повертає нічого, крім дзвінка до freeze(наскільки мені відомо), тому я вважаю, що frozen?це ваш найкращий вибір. Іншим вашим варіантом є порятунок, ActiveRecord::RecordNotFoundякщо ви зробили щось подібне record.reload.

Я думаю, що наведена вище тактика Майка може бути найкращою, або ви можете написати обгортку для цих згаданих випадків, якщо хочете почати "робити припущення".

Ура.


На даний момент я просто перевіряю заморожений ?, але справді я можу щось завантажити і заморозити з якоюсь іншою метою, і тоді це було б брехнею ... У нинішній ситуації заморожене? працює нормально, але я не хочу сподіватися на це довгостроково.
Даніель Хакстеп

0

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

Якщо цього не вдасться, ви, безсумнівно, можете додати до своїх моделей атрибут "знищений", який ви запускаєте у зворотних викликах і який можна перевірити, якщо ви хочете отримати більш точне рішення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.