#ruby-on-rails-3 #inheritance #mongoid #nested-attributes #ruby-1.9
#ruby-on-rails-3 #наследование #mongoid #вложенные атрибуты #ruby-1.9
Вопрос:
У меня проблема с наследованием mongoid. У меня есть почтовый индекс, который наследует от Location class оба документа mongoid. Он имеет следующую простую структуру наследования:
class Zipcode < Location
Также у меня есть объект, который заполняет объект почтового индекса с помощью nested_attributes. Я заметил, что когда он пытается создать объект Zipcode, вместо этого он создает объект Location. В моем тестовом коде все работает нормально, но в моем производственном коде все работает неправильно.
После запуска ruby-debug над моим кодом я обнаружил следующее поведение в файле: ~/work/Project/bson/ruby/1.9.1/gems/mongoid-2.2.3/lib/mongoid/document.rb:277
Breakpoint 2 at /Users/pc/work/Project/bson/ruby/1.9.1/gems/mongoid-2.2.3/lib/mongoid/document.rb:277
/Users/pc/work/Project/bson/ruby/1.9.1/gems/mongoid-2.2.3/lib/mongoid/document.rb:277
@_type ||= [descendants [self]].flatten.uniq.map { |t| t.to_s }
(rdb:48) p descendants
[]
(rdb:48) p Zipcode.ancestors amp;amp; [Location]
[Location]
(rdb:48) p descendants
[Zipcode]
(rdb:48)
Смотрите, странно, что потомки (которые находятся в BasicObject) заполняются при Zipcode.ancestors
вызове. Я использую Ruby1.9.2, Mongoid 2.2.3 и Rails3.1.1.
Вопросы: Есть ли что-то особенное в синтаксисе mongoid для получения наследования во вложенных атрибутах? Есть ли проблема, которую необходимо исправить в mongoid, rails или ruby?
Обновить:
Просто чтобы показать, что взлом тестового кода работает с первого раза:
Breakpoint 1 at /Users/pc/work/Project/bson/ruby/1.9.1/gems/mongoid-2.2.3/lib/mongoid/document.rb:277
/Users/pc/work/Project/bson/ruby/1.9.1/gems/mongoid-2.2.3/lib/mongoid/document.rb:277
@_type ||= [descendants [self]].flatten.uniq.map { |t| t.to_s }
(rdb:1) p descendants
[Zipcode]
Ответ №1:
Найденное решение пришлось изменить
config.cache_classes = true
в config/environments/development.rb. По-видимому, это иногда нарушает наследование в rails.