Jak przechowywać takie dane i jak się do nich dostać?

Hejka, w mojej bazie np. biżuteria może być złota, srebrna, lub miedziana. Są to typy dla modelu jewel.rb

def metal_types {"Złoto" => 1, "Srebro" => 2, "Miedź" => 3} end Póki co nie chcę tego przechowywać w bazie danych - i tego nie poddawajmy dyskusji :slight_smile:

W tej chwili definiuję sobie w modelu jewel.rb taką metodę zwracającą hasha, później z niej tworzę sobie w formularzu radiobuttony (@jewel.metal_types.each). Pytanie o miejsce, i sposób, w który tablica z typami powinna być zdefiniowana… Czy powinno to być pole modelu jewel? Czy tak jak robię teraz jest dobrze? A może jest inny lepszy sposób?

Na odsłonie elementu biżuterii info o typie wyświetlam w ten sposób:

[code Ruby]

  • Typ: <%= @jewel.metal_types[@jewel.type] %>
  • [/code]@jewel.type - to pole modelu, które mam w bazie.

    Zmień koloumnę w tabeli jewels z type INT na metal_type VARCHAR(20). W modelu Jewel dodaj walidację:

    validates_inclusion_of :metal_type, :in => %w(gold silver copper)

    Utwórz helper, w którym typ metalu będziesz zamieniać na nazwę widoczną dla użytkownika:

    [code=ruby]module MetalTypesHelper
    def metal_types
    {‘gold’ => ‘Złoto’} # etc.
    end

    def metal_type(jewel)
    metal_types[jewel.metal_type]
    end

    def metal_type_radios(jewel)
    # TODO: implement
    end
    end[/code]
    Zalety takiego rozwiązania:

    • Patrząc na tabelę w SQL od razu wiesz jakiego rodzaju jest biżuteria (metal_type=gold vs type=1)
    • Jesteś pewna, że pojawią się w tabeli tylko takie typy jak sobie życzysz (walidacja)
    • Pole type jest zastrzeżone w Rails dla STI, może powodować komplikacje
    • Konsekwentnie użyte nazewnictwo
    • Separacja widoku od modelu (polskie nazwy metali są tylko w widoku)

    Różnica w prędkości działania (po tym jak dodasz indeks) jest niezauważalna jeśli weźmiesz pod uwagę całą aplikację - a wygoda pracy znacznie większa.

    Masz dwa rozwiazania

    ewentualnie plugin

    W Twoim przypadku polecam pierwsze rozwiazanie