2012-01-31 1 views
7

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

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

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

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

+1

try active_reload gem это кеш-модель и истекает, когда в dev-режиме происходят какие-либо изменения. Я не знаю, почему он меняет время выполнения. Скачайте и попробуйте и дайте мне знать эту помощь для последнего выпуска – Amar

+0

Я думаю, что выглядит как он работает, мы сейчас на рейках 3.1 и, по-видимому, active_reload по умолчанию включен в rails 3.2. Немного сложно последовательно воспроизводить, но я обновлю этот вопрос, если будет похоже, что он ушел через несколько дней. – aproctor

+0

active_reload не работает. Хотя мы, возможно, не настроили его правильно – aproctor

ответ

1

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

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

Так что моя рекомендация состоит в том, чтобы убедиться, что вы не переосмысление каких-либо констант, известных к классу символов (или известных классов известных к классу символов и т.д.)

+1

Кажется, это просто другой фрагмент в объяснении @ stuartc. (т. е. патчи обезьян, переопределяющие определение модели, или определение связанных моделей.) Тот же механизм ... изменение модели средних испытаний приводит к каскадным перезагрузкам. –

0

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

Смежные вопросы