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

attributes_before_type_castМетод ActiveRecord возвращает хэш атрибутов до того, как произойдет приведение типов и десериализация.

Джон Топли
источник