Предупреждения Ruby Object#id и Активная запись
-
03-07-2019 - |
Вопрос
Мы продолжаем видеть предупреждения, подобные следующим, когда запускаем наши спецификации:
Идентификатор объекта # устареет;использовать объект#object_id
Код, о котором идет речь, обращается к идентификатору модели ActiveRecord (который, очевидно, является атрибутом в таблице, а не идентификатором экземпляра объекта в виртуальной машине Ruby).
Кто-нибудь знает, как отключить эти конкретные предупреждения или каким-то образом избежать их?
Решение
Я предполагаю, что вы делаете mocking / stubbing (потому что вы упомянули спецификации).
В моем случае я сталкиваюсь с этими предупреждениями, когда заглушаю объект ActiveRecord и получаю доступ к его атрибуту ID.
В случаях, когда вы ожидаете получить доступ к идентификатору вашего объекта ActiveRecord, я бы рекомендовал вам сделать следующее:
mock("MyActiveRecordObject", :id => 1001)
Другие советы
Попробуйте использовать [:id]
вместо того, чтобы .id
Когда объект происходит от ActiveRecord::Base
, призыв к id
переходит к AR::B's id
метод, а не устаревший на Object
.
Это предупреждение обычно означает, что один из моих объектов не такой, как я думаю.
Ваш объект на самом деле не является объектом AR, что обычно указывает на сбой при извлечении некоторых данных (Table.find_by_name('nonexistent name')
вернется nil
).Если все, что вы хотите сделать, это отключить видимые предупреждения, вы можете отключить whiny_nils
в вашей конфигурации, в противном случае выполните is_a?
проверьте, прежде чем пытаться получить доступ к атрибутам объекта, и корректно обработайте случай сбоя.
Предупреждение object#id появляется только в обычных классах ruby, таких как NilClass.ActiveRecord::Base переопределяет идентификатор объекта #