Zauważyłem, że czasami jestem w sytuacji, w której potrzebuję korzystać z jakiejś kolekcji połączonej z jakimś modelem, ale niekoniecznie chciałbym, żeby wszystko było zapisane w bazie danych.
Przykład:
Mam zaimplementowaną autoryzację opartą na grupach użytkowników. Grupy są wrzucone na stałe, uprawnienia też.
I teraz teoretycznie najbardziej Rails Way jest zrobienie modelu group, połączenie go z modelem user asocjacją one to many i wszystko działa bardzo fajnie.
Z tym, że jeżeli wiem, że grup będzie 3, to niekoniecznie potrzebuję do tego oddzielnej tabeli.
Zapewne łatwiej byłoby zrobić coś w rodzaju tableless model, gdzieś przy inicjalizacji dodać kod w stylu:
%w/user moderator admin/.each_with_index do |group, index|
Group.create(:id => index, :name => group)
end
Oczywiście create zapisywałby te 3 grupy do jakiejś zmiennej klasy. Po zdefiniowaniu has_many :groups w user.rb, dostępne byłyby wszystkie metody dostępne przy zwykłych asocjacjach.
Jest jeszcze trzecia opcja - dodanie do klasy User zmiennej klasy w stylu @@groups = [:user, :moderator, :admin] i zapisanie grupy w polu typu string. Zdecydowanie najmniej elastyczne i najbrzydsze, ale z bólem muszę się przyznać, że jakiś czas temu tak to zaimplementowałem - oczywiście do zmiany
Swoją drogą tutaj wychodzi temat robienia czegoś “the right way” - wydaje się czasami, że zrobienie czegoś tak jak się to powinno zrobić będzie dłuższe, więc pisze się szybkiego hacka, a tutaj wałek - dużo więcej czasu straci się na hacka + późniejsze naprawianie szkód, niż na zrobienie tego od razu solidnie. Zadziwiające jest to, że to stwierdzenie wydaje się oczywiste i zdaję sobie z tego sprawę już od dawna, ale co jakiś czas, przy odpowiednio niskich zasobach czasowych i wysokiej dozie zmęczenia/wkurzenia zdarza mi się coś takiego popełnić.
Wracając do sedna. Jak sobie z tym radzicie? Może jakieś pluginy do bezbolesnego zaimplementowania drugiego scenariusza?
A może bez sensu w ogóle się zastanawiam i od razu powinienem dorzucić jakiś task do rake’a z załadowaniem tych rzeczy do bazy danych i nie zawracać sobie głowy? (im dłużej nad tym postem siedzę tym bardziej zaczynam sądzić, że właściwie nie powinienem go pisać i tak właśnie zrobić, ale skoro już naklepałem się w klawiaturę to wyślę )