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
Czy dodajesz wspólną funkcjonalność bezpośrednio do źródła klejnotów? Którą klasę próbujesz zmienić? – Chris
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. –
Czy kiedykolwiek znalazłeś lepsze rozwiązanie tego? Mam ten sam problem. –