ActiveRecords неправильно сериализован в yaml
Когда я сериализую активные записи, я обнаруживаю, что формат yaml отличается в зависимости от того, на каком ящике я работаю. На одной коробке я получаю:
object: !ruby/object:User
вместо
object: !ruby/ActiveRecord:User
Первая версия является проблемой, потому что активная поддержка должна сделать что-то волшебное, чтобы правильно заполнить активную запись, когда дескриптор yaml. В чем причина этой разницы и как я могу убедиться, что используется второй формат?
Я использую ruby 1.9.2 и заставил движок yaml использовать syck, используя
require "yaml"
YAML::ENGINE.yamler = "syck"
в boot.rb (приложение rails).
Обновить
Покопавшись немного дальше, я обнаружил, что тип ActiveRecord не регистрируется в yaml. На сервере, где работает следующий вызов:
YAML.resolver.tags.keys
включает в себя:
"tag:ruby.yaml.org,2002:ActiveRecord"
Этот тип отсутствует на сервере, который ведет себя неправильно. Проблема сейчас в том, что я понятия не имею, почему тип не зарегистрирован.
2 ответа
Проблема оказалась взаимодействием между несколькими проблемами окружающей среды, которые я не упомянул в первоначальном вопросе.
Таким образом, проблема оказалась проблемой конфигурации с пассажиром. Если в вашем проекте есть файл config/setup_load_paths.rb, ваш Gemfile не загружается. Я добавил
require "yaml"
YAML::ENGINE.yamler = "syck"
вверху моего Gemfile, чтобы убедиться, что двигатель был выбран до того, как рельсы были загружены и зарегистрированы, это активный конвертер записей с yaml. Пассажир не запускал Gemfile, поэтому двигатель никогда не заводился, а ruby по умолчанию использовал pysch вместо syck. Текущая версия delayed_job заставляет использовать syck, но, поскольку psy загружается, ядро syck никогда не регистрировало активный конвертер записей.
Этот тип проблемы обычно вызывается перезагрузкой класса Rails. Вы пробовали установить:
config.cache_classes = true
в конфиге / средах / разработке.рб?