Як отримати початкове значення атрибута в Rails


96

чи є спосіб отримати вихідне значення атрибута ActiveRecord (= значення, завантажене з бази даних)?

Я хочу щось подібне у спостерігача

before_save object
  do_something_with object.original_name
end

Завдання - видалити об’єкт з хеш-таблиці (насправді, перемістити його до іншого ключа в таблиці) після оновлення.

Відповіді:


243

Перед рейками 5.1

Додавання _wasдо вашого атрибута дасть вам попереднє значення.

Для рейок 5.1+

Скопійовано з відповіді Лукаса Андраде нижче : https://stackoverflow.com/a/50973808/9359123


Додавання _wasзастаріло в Rails 5.1, тепер ви повинні додати_before_last_save

Щось на зразок:

before_save object
  do_something_with object.name_before_last_save
end

Поверне значення імені до останнього збереження в базі даних (працює для збереження та створення)


Різниця між документацією _wasта _before_last_saveвідповідно до неї:

_ було джерелом із документів

def attribute_was(attr)
  attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end

_before_last_save джерело з документів

def attribute_before_last_save(attr_name)
  mutations_before_last_save.original_value(attr_name)
end

7
Напр .: для self.context:self.context_was
Freedom_Ben

2
Де документація на це?
j буде

4
документацію можна знайти за адресою apidock.com/rails/ActiveModel/Dirty/attribute_was
hexinpeter

У документації немає жодного попередження про "анулювання" для _was.
Раель Гугельмін Кунья,

11

Для рейок 5.1+

Додавання _wasзастаріло в Rails 5.1, тепер ви повинні додати_before_last_save

Щось на зразок:

before_save object
  do_something_with object.name_before_last_save
end

Поверне значення імені до останнього збереження в базі даних (працює для збереження та створення)


Різниця між _wasта_before_last_saveвідповідно до неї:

_ було джерелом із документів

def attribute_was(attr)
  attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end

_before_last_save джерело з документів

def attribute_before_last_save(attr_name)
  mutations_before_last_save.original_value(attr_name)
end

Кращий приклад ви можете побачити тут


1
attribute_wasбув застарілим на користь attribute_in_database, тоді attribute_before_last_saveяк це абсолютно новий метод, починаючи з 5.1, який не має еквівалента в попередніх версіях Rails. Джерело: github.com/rails/rails/pull/25337#issuecomment-225166796
ohaleck


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