Struktura a'la tabela w bazie

Podajcie, proszę, prosty sposób na utworzenie struktury podobnej do tabeli w bazie, na której można operować podobnie jak na modelu (jak na tabeli bazy danych).

Muszę wybierać określone wartości na podstawie parametrów i pisanie “if-ów” lub “case’ów” wydaje mi się zaśmiecaniem kodu. Tworzenie tabeli w bazie, która nie podlega edycji i ma stałe wartości, też wydaje mi się chybione, tym bardziej, że tych pozycji “słownikowych” jest raptem kilkanaście

Znam określone wartości np.

MyDictionary = [
{ mytype: 'A', category: 'X', price: 3}, 
{ mytype: 'B', category: 'Z', price: 5}, 
{ mytype: 'F', category: 'Z', price: 8} 
.....
]

i chciałbym zapisać to “na sztywno” w kodzie oraz posługiwać się znanymi rozwiązaniami typu:

szukana_wartość = MyDictionary.find_by(mytype: 'B', category: 'Z').price

Czy idę dobrym tropem:

MyDictionary = Struct.new(:mytype, :category, :price) 

?

A może w ogóle to zapisywanie na sztywno, to “średnio” trafiony pomysł i macie lepsze rozwiązanie?

Wstaw to do bazy. W bazie danych jest mnóstwo danych, które w praktyce nie zmieniają się i nikt z tego powodu nie robi problemów.

OK.
A jak taką tabelkę w całości wciągnąć do cache, by nie odpytywać ciągle bazy?

Polecam - https://github.com/zilkey/active_hash - chyba idealnie pasuje :smile:

2 Likes

Oooo!

Super!
O coś takiego mi właśnie chodziło. :smile:

Dzięki

Fajny gemik;]

O jaki czad, nie znałem!

Jaki jest sens dodawać kolejną zależność do naszych aplikacji, jeśli mamy już taką samą funkcjonalność w aplikacji (zresztą ten gem emuluje pewien podzbiór operacji z AR)? Może to ze mną coś nie tak, ale im starszy jestem tym mniej chętnie dodaję kolejne gemy do aplikacji, tym bardziej jak robią coś co już mam (jak w tym przypadku), albo mogę mieć niewielkim kosztem.

Ja mam w projekcie obecnie 12 kolekcji korzystajace z tego gem’a i pozwala mi to na zaoszczedzenie w niektorych widokach API kilkunastu zapytan. Kazda z tych kolekcji ma kika, kilkanascie wierszy i nie widze sensu trzymania tego w bazie.

1 Like

Trochę brzydka i niebezpieczna implementacja jednej z metod: https://github.com/zilkey/active_hash/blob/master/lib/active_hash/base.rb#L257
Zastanowiłbym się przed użyciem tego gema.

A co konkretnie tu jest niebezpiecznego?

Obsługa wyrażeń regularnych słaba z punktu widzenia współbieżności (zmienne globalne).

Przecież te zmienne są wynikami wykonania regexpa w ciele tej samej metody (i są wołane wyłącznie “na czysto”, zaraz po regexpie który je ustawia), więc nie ma szans na jakiekolwiek problemy ze współbieżnością.

Ok, faktycznie źle to zinterpretowałem. Wyjaśnia to zdanie “These global variables are thread-local and method-local variables.” z dokumentacji: http://ruby-doc.org/core-2.1.0/Regexp.html#class-Regexp-label-Special+global+variables
Sorki za zamieszanie :smile: