Select w modelu czy stała

WItam,

W formularzu mam selecta gdzie wybieram kategorie obiektu. Kategorii jest 5 i na 99% się to nie zmieni.
Czy lepiej utworzyć model i trzymać te kategorie w bazie, czy moze lepiej utworzyć stała:
KAT = [‘Kat1’, ‘Kat2’, ‘Kat3’, ‘Kat4’, ‘Kat5’]
Pozdrawiam

Te “na 99% się to nie zmieni” może przerodzić się bardzo szybko w 99% że jednak się zmieni. Być może na poczatku projektu lepiej nie zakładać takich rzeczy ale z drugiej strony, lepiej być przygotowanym na zmiany.

Zrób model a do obiektu przypisuj category_id, jeśli oczywiście obiekt może być tylko w jednej kategorii. W przeciwnym przypadku, przyda się dodatkowy model łączący pomiędzy nimi.

Niewiele napisałeś o kontekście w jakim będziesz używać tych kategorii.

Uczyń dostęp do Kategorii niezależny od implementacji. Możesz stworzyć dodatkową klasę, której interfejs pozwoli na pobranie kategorii (aktualnie będzie to stała). W przyszłości, jeżeli będzie taka potrzeba zmienisz sposób generowania tej listy (dynamicznie z bazy danych), a interfejs nie zmieni się.

A mozesz wrzucic kawalek kodu jak to powinno wygladac?

Dla mnie to jest kwestia odpowiedzenia sobie na jedno bardzo ważne pytanie: jeśli wybiorę teraz prostszą wersję i w przyszłości będę jednak chciał wprowadzić to drugie rozwiązanie, to czy koszt jego wprowadzenia będzie większy niż gdybym zrobił to teraz? W większości przypadków lepiej jest wprowadzić wersję prostszą (raz, że KISS, dwa, że YAGNI, trzy - testy), jednak są pewnego rodzaju wybory, które po prostu z czasem jest ciężko wprowadzić (np. zmiana bazy danych, albo przejście na obsługę wielu wątków).

Kod zależy od Ciebie. Chodzi mi po prostu o wyciągnięcie tej listy poza stałą do metody.

class Categories
  def self.categories
     ['Kat1', 'Kat2', 'Kat3', 'Kat4', 'Kat5'].freeze
  end
end

W momencie dodawania I18n, restrykcji (np. tylko cześć użytkowników ma dostęp do ‘Kat5’), czy nawet zmiany sposobu przetrzymywania danych na bazę danych interfejs pozostanie ten sam (ten przykład z jedną metodą jest akurat z czapy, może być lepszy). Do tego pojawia się jeszcze pytanie, czy jesteś w stanie na ten moment znaleźć taki stały interfejs - możliwe, że nie.

Przetrzymywanie danych w bazie danych ma sens wtedy i tylko wtedy, gdy te dane się zmieniają. Alternatywą nie jest tylko trzymanie stałych w kodzie. Równie dobrze może to być ładowany plik YAML.

Zgadzam się z @radarek, że wybór to kwestia wyczucia wynikającego z kontekstu. Ja jednak jestem generalnie przeciwnikiem stałych w takich rozbudowanych przypadkach i od razu pomyślałbym do przodu. Stworzenie klasy zamiast stałej to tylko kilka uderzeń w klawisze więcej. Popieram KISS, YAGNI, ale nie wolno tez zapomnieć o SOLID :slight_smile: