Zajęło mi to trochę czasu, ale znalazłem odpowiedź. Postanowiłem to opublikować, mając nadzieję, że pomoże innym.
Mongoid implementuje coś, co nazywa się „dziedziczeniem pojedynczej tabeli”. Gdy tylko wyprowadzisz klasę podrzędną z klasy nadrzędnej, dziecko będzie przechowywane w kolekcji nadrzędnej, dodając atrybut „typ”. Użycie "store_in" mówi mongodb jawnie, w której kolekcji ma przechowywać dokumenty. Zdefiniowanie store_in w klasie potomnej powoduje, że mongoid przechowuje wszystko (włącznie z rodzicem) w danej kolekcji. Myślę, że przy użyciu dedykowanych przypisań store_in dla każdego dziecka bałagan mongoid up. Jednak w rezultacie dokumenty są przechowywane losowo w dowolnej z podanych kolekcji.
Można to rozwiązać w Rubim, używając modułu jako domieszki dla wspólnej funkcjonalności. Jest to dość dobrze opisane w ten dokument .
ALE zdecydowałem się tego nie robić! Powodem, dla którego tego chciałem, jest to, aby moje kolekcje były małe, mając nadzieję na uzyskanie lepszej wydajności. Po rozmowie z ekspertami (10 generacji) myślę, że lepszym podejściem jest użycie kolekcji obiektów z jednym rodzicem dla wszystkich elementów podrzędnych. Nie powinno to mieć wpływu na wydajność mongodb, ale rozwiązanie staje się znacznie bardziej elastyczne. W rzeczywistości znacznie lepiej wykorzystuje to projekt bez schematu w mongodb.
Kod znów będzie wyglądał tak:
class BaseClass
include Mongoid::Document
... shared functionality
end
class ChildClass1 < BaseClass
...individual functionality...
end
class ChildClass2 < BaseClass
...individual functionality...
end