2017-02-14 17 views
0

Я храню массив типизированных объектов в модели ActiveRecord, как:Неопределенного класс/модуль при Сериализация

class Store::Bin < ActiveRecord::Base 
    serialize :items, Array 
end 

class Store::Item 
    include Virtus.model 
    attribute :name, String 
    ... 
end 

Когда я делаю изменение кода в режиме development и обновить свой браузер, я получаю undefined class/module Store::Item исключение.

Кажется, что что-то пересекается с загрузкой класса. Все файлы находятся в каталоге app/models/store/..., правильно названном w/r, на имя их верблюда.

Такая же проблема возникает при использовании консоли рельсов. reload! не устраняет проблему в консоли; вместо этого мне нужно выйти и перезапустить консоль.

ответ

0

Вы должны избегать оператора :: при определении классов из-за проблем с автозагрузкой Rails. Вместо этого попробуйте

module Store 
    class Item 
    # ... 
    end 
end 

Когда вы не уверены в том, что происходит вы можете использовать Module.nesting, чтобы выяснить, как Rails интерпретирует иерархию.

+0

К сожалению, указав модуль отдельно не решить мою проблему, потому что это было связанно с автозагрузчиком не видя требование к сериализованному классу: магазин :: Пункта – vanboom

0

Добавление типа к массиву, казалось, решило проблему ... но вызвало проблему с соответствующей фабрикой FactoryGirl.

class Store::Bin < ActiveRecord::Base 
    serialize :items, Array[Store::Item] 
end 

UPDATE: реальная проблема в том, что при изменении кода производится для сохранения/bin.rb, что класс получает автоматически загружен, но автозагрузчик понятия не имел, что магазин :: Пункт был зависимость.

РЕАЛЬНАЯ FIX: Объявить требуемую зависимость с помощью require_dependency

require_dependency "store/item" 
class Store::Bin < ActiveRecord::Base 
    serialize :items, Array 
end