2012-03-15 11 views
8

Czytam dziedziczenie w mongoid i wydaje się, że wszystkie odziedziczone klasy zaoszczędzą w klasie bazowej, np.Zapisz dziedziczony obiekt do oddzielnej kolekcji w Mongoidzie

class BaseClass 
end 

class ChildClass1 < BaseClass 
end 

class ChildClass2 < BaseClass 
end 

Wydaje się, że wszystkie te przechowywać w kolekcji klasy bazowej.

Tak naprawdę chcę je przechowywać w oddzielnych kolekcjach, np. ChildClass1 - collection i ChildClass2 - collection.

+0

Zgodnie z dyskusją na ten temat (https://github.com/mongoid/mongoid/issues/1133) zakładam, że nie ma sposobu na przechowywanie podklas w oddzielnych kolekcjach. Możesz iść z mixins zamiast dziedziczenia, jak sugeruje Durran w tym wydaniu. –

+0

Czy jest jakiś problem z korzystaniem z tego: self.collection_name = "account"? Oczywiście moim celem jest utrzymanie małych zbiorów. Czy to dobry pomysł? – Boenne

+0

Znalazłem dobrą odpowiedź tutaj http://stackoverflow.com/questions/10704310/mongoid-store-in-produces-random-results – Arugin

Odpowiedz

3

Nie można tego zrobić. Bo to pojęcie STI W Mongoid jak explain by Durran the Mongoid creator

Jeśli naprawdę chcesz zapisać w kilku kolekcji trzeba użyć modułu obejmują takie jak:

class BaseClass 
    include MyModule 
end 

class ChildClass1 
    include MyModule 
end 

class ChildClass2 
    include MyModule 
end 
+0

Dzięki, to dobre wejście. A co z tym? self.collection_name = "konto"? czy jest jakiś haczyk? – Boenne

+1

musisz użyć metody klasy 'store_in', aby zdefiniować, w której kolekcji chcesz zapisać obiekt – shingara

4

ja sobie z tego sprawy został opublikowany rok temu, ale to może być czego szukaliśmy:

class BaseClass 
    include Mongoid::Document 
    def self.inherited(subclass) 
    super 
    subclass.store_in subclass.to_s.tableize 
    end 
end 

class ChildClass1 < BaseClass 
end 

class ChildClass2 < BaseClass 
end 
0

spróbuj tego podejścia:

module Base 
    extend ActiveSupport::Concern 

    include Mongoid::Document 
    include Mongoid::Timestamps 

    included do 
    # Common code goes here. 
    end 
end 

class ChildClass1 
    include Base 
end 

class ChildClass2 
    include Base 
end 

Robię to w mojej aplikacji Rails 5 i działa na pewno.

Powiązane problemy