Piszac moj act_as_tree element natknole sie na dziwne zachowanie sie tego plugin w production z wlaczonym caching classes. Otoz jezeli mialem zadeklarowana jakas wartosc dla klasy np:
def self.foo
@bar = Time.now unless @bar
end
to wartos @bar byla cachowana w obrebie nie jednego requestu ale wszystich requestow, zmieniala sie dopiero gdy @bar bylo nil czyli po restarcie aplikacji Musialem dodac after_save i after_destroy @bar = nil aby moc w jakikolkwikek sposob te dane odswiezac poniewaz w mojej aplikacji te dane byly wykorzystywane wielokrotnie przez plugin. Teraz po rozwiazaniu tego problemu niedosc ze dane sa wykorzystywane wieloktronie w 1 requescie to dzieje sie tak samo we wszystich requestach, a @bar jest czyszczone dopiero po after_save lub after_destroy.
Jednym slowem, przy wlaczonym cachowaniu klas i ustawianiem jakiejs wartosci dla klasy mamy tak jakby shared memory i przyszlo mi do glowy ze mozna by w ten sposob stworzyc swietny system cachowania dla ActiveRecord. Co by bylo potrzebne?
- Nadpisanie wszystkich metod odwolujacych sie do bazy danych, kazda metoda ktora wykorzystuje jakias instrukcjie sql UPDATE, INSERT zamiast odwolywac sie do bazy danych w pierwszej kolejnosci sprawdzala by czy dane przypadkiem nie istnieja juz w cache. Jezeli nie to wykonuje zapytanie sql dodaje do cache rezultat oraz zwraca go.
- Metody after_save i after_destroy powinny robic flush cache dla wszystkich zapytan ktore sa powiazane z dany modelem.
Teoretycznie powinny chyba wystarczyc 2 zmienne Hash do tego jedna jako indeks z nazwami modeli druga jako indeks z zapytaniami oraz juz rezultatami z tych zapytan.
Dzieki temu otrzymalibysmy system ktory maksymalnie jak to tylko mozliwe minimalizowal by odwolania do bazy danych, oraz zutowanie na activerecord. Nie wiem tylko jaki aktualnie mamy system cachowania ? Jest jakis ? Moze jest lepszy i nie warto Oczywiscie ten system mialby tylko sens z wlaczonym cachowaniem klas, mozna by to tez zrobic na bazie jakiegos modulu pamieci dzielonej dla rubego.
Edit: jak zwykle nie wymyslilem nic nowego act_as_cached robi z grubsza to co napisalem tyle ze za pomoco memcached, z tym ze ja tu mysle o czyms owiele bardziej przezroczystym.