Mam problem polegający na tym, że aplikacja którą stworzyłem musi być dostarczana w wielu różnych wersjach (każdy klient ma swoje dodatkowe wymagania). Najogólniej rzecz ujmując aplikacja służy do składania i obsługi zamówień. Chciałbym tak ją przeprojektować żeby dodanie np. wymaganego pola numer referencyjny zamówienia było maksymalnie proste, a przede wszystkim żeby taka modyfikacja miała własny plik/folder który będę mógł w łatwy sposób przenosić/instalować.
Wydaje mi się że sensowne jest w tym wypadku zastosowanie wzorca programistycznego Observer (https://github.com/rails/rails-observers) mam jednak problem z walidacjami, bo pomimo możliwości manipulowania dodanymi polami przez obserwatorów nie jestem w stanie dodać w żaden “ładny” sposób walidacji dodatkowych pól. Pojawia się też problem z migracjami które będą na pewno potrzebne w niektórych przypadkach.
Być może jakimś rozwiązaniem jest podział całości na gemy (core + dodatki każdy we własnym gemie), ale tutaj już zupełnie nie mam pomysłu jak mogłoby to wyglądać/działać.
Będę wdzięczny za sugestie i ewentualne linki z przykładami.
Gdyby ktoś w przyszłości miał podobny problem to udało mi się znaleźć rozwiązanie, być może jest ono oczywiste dla większości z was, wystarczy wykorzystać Rails Engines.
Ciekawy i pomocny był artykuł dotyczący Rails Engines https://www.toptal.com/ruby-on-rails/rails-engines-in-the-wild-real-world-examples-of-rails-engines-in-action zawierający przykłady zastosowań w wybranych gemach.
Podczas refaktoryzacji mojego kodu oparłem się o rozwiązania zastosowane w systemie ecommerce Spree, gdzie w dosyć prosty sposób Rails Engines są wykorzystywane do implementacji rozszerzeń.
Z ciekawosci, jakie jest twoje podejscie do bazy danych. Uzywasz zwyklej bazy SQL czy jakiegos rozwiazania NoSQL?
Nie wiem na ile jest to istotne dla kwestii modularyzacji, ale odpowiadając na Twoje pytanie to używam zwykłej bazy PostgreSQL. Oczywiście każdy engine musi posiadać zdefiniowane odpowiednie migracje, które muszą zostać wykonane po jego instalacji.
Nie jest to oczywiście rozwiązanie pozwalające użytkownikom na samodzielną instalację napisanych przeze mnie modułów, ale wystarcza żebym mógł z tych modułów skomponować aplikację dostosowaną dla konkretnego klienta.