2013-05-09 7 views
18

Budujemy aplikacje, które mają Modele, które nie są komponentami bazy danych. Jesteśmy ciekawi, co robią inni w społeczności rails, aby rozwiązać ten problem.Szyny - Gdzie (katalogi) umieszczać Modele, które nie są aktywne Rekord

Walczymy z tym, gdzie je umieścić.

Jeżeli mamy:

app/models/domain 

lub

app/domain/models 

czy może

app/models # Business Models 
app/models/ar # Active Record Models 

czy może

app/models/domain/ # Business Models 
app/models/domain/ar # Active Record Models 

Po części zmagamy się z tym, jak bliskie są standardom szyn i jak bardzo chcemy stworzyć strukturę, która będzie odpowiednia dla tego, czego potrzebujemy.

Jeśli myślimy obiektów jak obsługa obiektów, możemy mieć

app/models/service-object 

i

app/models/ # For plain active record 

Inna droga, aby przejść w dół nie ma rzeczy wewnątrz aplikacji, na przykład

/service_objects 

zamiast

/app/models/service_objects 

Przypuszczalnie jeśli chcemy dostęp za pośrednictwem aplikacji szyn jesteśmy lepiej korzystania z aplikacji/w celu skorzystania z konwencji nad konfiguracją.

+5

Katalog nazywa się "modele". Nie jest to nazywane "tylko potomkowie aktywnych rekordów". Po prostu je składam i rzucam modele Mongoid na górę :) –

+0

Możesz umieścić je pod 'lib' jeśli naprawdę chcesz trzymać się AR-only w modelach – Raindal

+1

Zastanowiłbym się nad wtrąceniem ich w' lib' ale wciąż jest opcją . Lubię zapisywać pliki w bibliotece, które uważam za dobre kandydatury do wydawania klejnotów do ponownego wykorzystania. –

Odpowiedz

12

Z mojego doświadczenia wynika, że ​​podział tych modeli sprowadza się do tego, co funkcjonalnie reprezentują w konkretnym kontekście aplikacji.

Zazwyczaj rezerwuję app/models dla modeli opartych na zasobach. Jeśli ten model reprezentuje zasób, który jest instancjonowany i manipulowany przez aplikację, jest tutaj. Nie musi być AR lub db wspierane.

Jeśli model obsługuje spójną funkcjonalność, ale różni się w zależności od parametrów, nadaję im najwyższy poziom w aplikacji. Takich jak app/mailersapp/observers itp. Jednakże, jeśli masz jeden zasób wymagający obserwatora, może nie mieć sensu posiadanie katalogu app/observers z jednym tylko plikiem.

Wszystko inne przechodzi w lib. Jest kilka powodów, dla których jest to lepsze.

  1. Możesz wybrać, kiedy pliki będą wymagać w lib. Możesz znacznie bardziej selektywnie decydować, które pliki zostaną załadowane po uruchomieniu aplikacji. Jeśli umieścisz wszystko w app/models, nie masz ziarnistości nad tym, co zostanie załadowane.

  2. Namespacing your models as app coraz łatwiej jest w lib. Oczywiście, możesz nazwać przestrzeń w app/models, ale kilka warstw gniazdowania w app/models zawsze kończy się nieprzyjemnym. Najlepiej jest zachować przestrzeń nazw w numerze lib.

  3. Sprzątanie jest o wiele łatwiejsze, gdy masz rzeczy w ich funkcjonalnie poprawnym miejscu. To nie jest zasób? To nie jest obserwator? Musi być w lib. Cały powód, dla którego zastanawiasz się nad tym, to zapewnienie wykrywalności deweloperom.

14

W przypadku obiektów usługowych zazwyczaj można je znaleźć bezpośrednio w katalogu aplikacji app/services/. Robotnicy i serializatory również podążają za tym wzorem: app/workers/app/serializers/. Jeśli chodzi o modele, które nie są AR, nadal możesz trzymać je w katalogu modeli. To tylko moje podejście do tego.

+0

+1 To jest przydatne, dzięki. Jesteśmy nieco zaniepokojeni tym, że wraz ze wzrostem aplikacji możemy otrzymać 34 modele Active Record i 12 Non-Active Record, a następnie modele będą miały razem 46 mash-mash. To może być ok, zastanawiamy się również nad tą potencjalną przyszłością. –

+2

Zgadzam się z tym - w pewnym momencie, jeśli masz stabilne modele inne niż AR, które pasują do określonych funkcji, możesz zawsze wyodrębnić je do modułów. – mikeryz

+0

Cóż, sprowadza się to również do rozdzielania spraw przez aplikacje. Nie chcesz, aby pojedyncza aplikacja była tak duża, że ​​nie możesz nią zarządzać. Na przykład, gdy aplikacja staje się zbyt duża, rozważam oddzielenie auth do własnej aplikacji i podążanie za tym wzorcem, a następnie komunikowanie się za pośrednictwem interfejsów API. –

1

Jeśli masz klasy, które nie są modelami, na przykład mogą one reprezentować formularz, chciałbym powiedzieć, aby je umieścić w lib.

Jeśli są one ortogonalne dla twojej aplikacji, tzn .: jest to jakiś interfejs używany do wywoływania innej aplikacji, możesz go zawinąć jako prywatny lub publiczny klejnot w zależności od jego zastosowania do reszty społeczności.

W końcu tak naprawdę nie ma to znaczenia. Wybierz jedną rzecz i uzgodnij ją z resztą zespołu. Przenoszenie elementów powinno być łatwe, szczególnie jeśli dodasz cokolwiek zdecydujesz o użyciu do ścieżki ładowania dla aplikacji ($LOAD_PATH += '...').

9

Jeśli są to modele, należy je umieścić w app/models, ponieważ katalog ten jest przeznaczony dla modeli, a nie tylko dla podklas ActiveRecord.

+0

to działa dobrze, robiłem to z szynami 5 –

Powiązane problemy