Ruby Object # id предупреждения и Active Record - PullRequest
9 голосов
/ 04 марта 2009

Мы продолжаем видеть подобные предупреждения, когда запускаем наши спецификации:

Идентификатор объекта # будет устаревшим; используйте Object # object_id

Рассматриваемый код обращается к идентификатору модели ActiveRecord (который, очевидно, является атрибутом таблицы, а не идентификатором экземпляра объекта в виртуальной машине Ruby).

Кто-нибудь знает, как отключить эти конкретные предупреждения или как-то их избежать?

Ответы [ 5 ]

15 голосов
/ 04 марта 2009

Попробуйте использовать [:id] вместо .id

10 голосов
/ 04 марта 2009

Когда объект происходит от ActiveRecord::Base, вызов id переходит к методу AR :: B id, а не к устаревшему на Object.

Это предупреждение обычно означает, что один из моих объектов не тот, о котором я думаю.

6 голосов
/ 05 марта 2009

Я предполагаю, что вы делаете насмешку (потому что вы упомянули спецификации).

В моем случае я сталкиваюсь с этими предупреждениями, когда заглушаю объект ActiveRecord и получаю доступ к его атрибуту ID.

В тех случаях, когда вы ожидаете получить доступ к идентификатору вашего объекта ActiveRecord, я бы рекомендовал вам сделать следующее:

 mock("MyActiveRecordObject", :id => 1001)
4 голосов
/ 04 марта 2009

Ваш объект на самом деле не является объектом AR, обычно это указывает на сбой при получении некоторых данных (Table.find_by_name('nonexistent name') вернет nil). Если все, что вам нужно, это отключить видимые предупреждения, вы можете отключить whiny_nils в своей конфигурации, в противном случае выполните тест is_a?, прежде чем пытаться получить доступ к атрибутам объекта и корректно обработать случай сбоя.

2 голосов
/ 04 марта 2009

Предупреждение об идентификаторе объекта # происходит только в обычных классах ruby, таких как NilClass. ActiveRecord :: Base переопределяет объект # id

...