Модели Rails перезагружены в середине запроса, что приводит к AssociationTypeMismatch - PullRequest
7 голосов
/ 31 января 2012

Мы столкнулись с проблемой в Rails 3.1, когда работали в режиме разработки.Кажется, что наши модели иногда перезагружаются в середине запроса, и для классов нашей модели устанавливается новый object_id.В результате получается ActiveRecord :: AssociationTypeMismatch

Ожидается символ ActiveRecord :: AssociationTypeMismatch (# 2194222580), полученный символ (# 2185863000)

Если повернуть config.cache_classes = trueв development.rb проблема, похоже, исчезла, но развиваться так нереально, поскольку нам придется постоянно перезагружать наши серверы.

У кого-то есть идея, почему модели могут быть перезагружены в середине запроса, или еслиесть ли способ заставить кеш работать в течение всего запроса?

Ответы [ 2 ]

1 голос
/ 27 ноября 2012

При config.cache_classes = false любое изменение в модели вызывает перезагрузку.Это включает в себя определение / переопределение константы, определенной в / известной модели.

У нас была эта проблема с использованием rspec и ActsAsFu.Переопределение класса Fu во время теста вызвало перезагрузку связанных (даже косвенно связанных) классов, и мы получили ошибку ActiveRecord :: AssociationTypeMismatch для связанного объекта.Мы посчитали это нашим, потому что у нас были тесты, которые выполнялись в одиночку, но не работали после других тестов.Наше решение состояло в том, чтобы просто создавать классы Fu с отдельными именами для каждой конфигурации и избегать переназначения имени класса во время теста.

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

0 голосов
/ 27 апреля 2013

В прошлом я обнаружил, что повторное открытие (исправление обезьян) модели ActiveRecord фактически перезагрузит весь класс сверху вниз.Попробуйте найти в своей базе кода более одного экземпляра class Character.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...