Rails: Retrieved Object не имеет атрибутов и не сравним с реальным

Эта проблема действительно теряет меня.

У меня есть модель для аутентификации: user. У меня есть модель для комментариев: comment. У меня есть модель, которую можно комментировать: weburl.

Weburl 1..* Комментарий Weburl *..1 Комментарий пользователя *..1 Пользователь

Проблема, с которой я сталкиваюсь, не поддается проверке (все мои тесты проходят) и не происходит постоянно. Обычно это происходит во второй раз, когда я генерирую одно и то же действие контроллера.

Проблема заключается в том, что мой пользователь связан с моим комментарием, и извлечение через comment.user становится НЕ РАВНЫМ для current_user, даже если атрибуты одинаковы. Например :

(comment.user.login == current_user.login == User.find(1).login)
     ==> True
(comment.user.id)
     ==> Unknown in the current context
(comment.user.class == User == current_user.class)
     ==> True 

Я дважды проверил отношения belongs_to и has_one has_many в своих моделях.

Я предполагаю, что это как-то связано с кэшированием, я сталкиваюсь с этим в своей среде разработки, но не в своих автоматических тестах и ​​не в производстве.

хотелось бы понять в чем дело.

Спасибо

РЕДАКТИРОВАНИЕ Добавление моего файла инициализации development.rb

config.cache_classes = false                                    #Set to true for prod
config.whiny_nils = true
config.action_controller.consider_all_requests_local = true     #Set to false for prod
config.action_view.debug_rjs                         = true
config.action_controller.perform_caching             = false    #Set to true for prod

EDIT #2 Если config.cache_classes имеет значение true, ошибка не возникает

Док говорит: # В среде разработки код вашего приложения перезагружается при каждом запросе. Это замедляет время отклика, но идеально подходит для разработки, поскольку вам не нужно перезапускать веб-сервер при внесении изменений в код.

нашел следующий билет, возможно, он взаимосвязан http://dev.rubyonrails.org/ticket/10722 Также проблема возникает с Mongrel и WebRick.


person user62605    schedule 04.02.2009    source источник
comment
какая версия рейлов? (список драгоценных камней --local). Кроме того, покопайтесь в своих моделях, используя 'script/console RAILS_ENV=production', и дайте мне знать, сможете ли вы воспроизвести там проблемы.   -  person Lolindrath    schedule 05.02.2009
comment
Можете ли вы установить config.cache_classes=false в своей тестовой среде и повторно запустить тесты?   -  person Srdjan Pejic    schedule 05.02.2009
comment
Срджан Пежич: Хорошая идея, но тесты проходят. Я добавил новый тест, который вызывает в 10 раз одну и ту же модель... не уверен, сможет ли функциональный тест воспроизвести эту проблему или мне понадобится интеграционный тест.   -  person user62605    schedule 05.02.2009


Ответы (3)


Я думаю, что вы имеете в виду из своего вопроса: почему это не работает: comment.user == current_user.

Когда вы сравниваете два объекта Ruby друг с другом, то есть comment.user == current_user, вы сравниваете их ссылки, поскольку они являются двумя уникальными объектами и находятся в разных областях памяти, это правильное поведение.

Вместо этого вам придется сравнить некоторые другие уникальные поля, такие как логин или идентификатор.

person Lolindrath    schedule 04.02.2009
comment
Это имеет смысл, за исключением того, почему я не могу вызвать comment.user.id ? И почему это поведение должно отличаться между prod и dev? Наконец, у меня сложилось впечатление, что я могу использовать оператор == для сравнения экземпляров... не уверен, насколько это повлияет на мой код... - person user62605; 05.02.2009
comment
Протестировано путем замены == на .eql? (который сравнивает тип и значение) без успеха - person user62605; 05.02.2009
comment
Если config.cache_classes истинен, ошибка не происходит. Док говорит: # В среде разработки код вашего приложения перезагружается при каждом запросе. Это замедляет время отклика, но идеально подходит для разработки, поскольку вам не нужно перезапускать веб-сервер при внесении изменений в код. - person user62605; 05.02.2009
comment
На самом деле, я думаю, что это ответ. Объект, извлеченный из БД, не совпадает с сохраненным в нем объектом. Просто у него такие же атрибуты. Таким образом, объектно-реляционные системы, такие как рельсы, могут сбивать с толку. - person Joe Soul-bringer; 05.02.2009

Какая именно ошибка возникает здесь: (comment.user.id)? Если вы не можете получить доступ к объекту User из объекта Comment, возможно, вы что-то упустили в модели. Я не близок к консоли, чтобы проверить это, хотя

person Srdjan Pejic    schedule 04.02.2009
comment
Я трижды проверил свой комментарий и пользовательские модели, они действительны. Метод .user добавлен правильно, его содержимое не работает - person user62605; 05.02.2009

У меня была аналогичная проблема, и я решил ее, сбросив и перечитав базу данных.

person tillmo    schedule 03.01.2013