Как получить исходное значение атрибута в 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 will

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.