2013-04-28 14 views
5

Używam mongoid z szynami 3 i pojawiłem się ostatnio w bardzo trudnym problemie i potrzebuję porady.ActiveSupport :: Obawy i rozszerzenie modelu mongoid

Pracuję nad CMS i jednym z pomysłów było to, że CMS zapewni niektóre modele podstawowe definicje i użytkownik końcowy będzie, w razie potrzeby, przedłużyć podstawowe klasy z własnymi definicjami i kontroli oraz zapisywać je w różnych zbiorach (tabele).

class DcPage 
    include Mongoid::Document 

    field a .... 
    belongs_to b .... 
    validates a .... 
end 

class MyPage < DcPage 
    field c .... 
    validates c .... 
end 

Aż ostatnia wersja mongoid ten pracował (z małym siekać) oraz dane byłyby zapisywane kolekcji my_pages. Z powodu pewnego problemu, mongoid no dłużej obsługuje to zachowanie, a dane zawsze są zapisywane do kolekcji dc_pages .

Podczas wyjaśniania mojego problemu, zespół mongoidów zasugerował, żebym użył ActiveSupport :: Concern i podał mi przykład. Które działa idealnie OK, jeśli klasa rozszerzona jest zdefiniowana w tym samym pliku źródłowym. Które btw. nigdy nie dzieje się w praktyce.

module CommonBehaviour 
    extend ActiveSupport::Concern 

    included do 
    field :subject, type: String, default: '' 
    # ... 
    end 
end 

class DcPage 
    include Mongoid::Document 
    include CommonBehaviour 
end 

class MyPage 
    include Mongoid::Document 
    include CommonBehaviour 
end 

Do tej pory dowiedzieliśmy się, że to działa, jeśli wymagają podstawowej plik źródłowy w mojego drugiego pliku. Który wygląda tak: wymagają '/some/path/to/my/gem/app/models/dc_page.rb

Czy możesz teraz zobaczyć mój ból. Podstawowy plik źródłowy zostałby oczywiście wsparty na klejnot i tym samym staje się ruchomym celem.

Proszę mi pomóc w lepszym rozwiązaniu.

przez Rhizobium

+1

Czy dodajesz wspólną funkcjonalność bezpośrednio do źródła klejnotów? Którą klasę próbujesz zmienić? – Chris

+0

Zakładam, że moduły CommonBehaviour i DcPage znajdują się w tym samym pliku źródłowym ../app/models/dc_page.rb, który jest zawarty w pliku gem. Klasa MyPage jest zdefiniowana w bieżącej aplikacji jako ../app/models/my_page.rb i rozszerzy klasę DcPage. W tym scenariuszu zawiera moduł CommonBehaviur, który jest zawarty w obu klasach. –

+0

Czy kiedykolwiek znalazłeś lepsze rozwiązanie tego? Mam ten sam problem. –

Odpowiedz

1

Powód to nie działa tak, ponieważ jest to wzór dla pojedynczej tabeli dziedziczenia. Aby to zadziałało, należy wyłączyć dziedziczenie tabel.

Jednak sugestia od mongoidowych programistów jest właściwą drogą do zrobienia w tym przypadku. Wygląda na to, że potrzebujesz poprawnie moduł/klasy.

Powiązane problemy