6

Wcześniej skonfigurować buforowanie działania (z zamiatarki, ale myślę, że to nieistotne tutaj) w mojej aplikacji, i jak dotąd działa świetnie z wyjątkiem jednej rzeczy:szyn: Kończący wielu stron na jednej akcji

I używaj Kaminari do stronicowania, a kiedy wykonuję expire_action w mojej akcji, to wygasa tylko pierwsza strona. Ponieważ wiem, że buforowanie nie działa przy użyciu ciągu zapytania w celu określenia strony, skonfigurowałem trasę, aby strony były dołączane na końcu adresu URL (na przykład/ludzie/123/strona/2).

Dodam więcej informacji do tego posta, jeśli to konieczne, ale domyślam się, że jest tu coś oczywistego, czego tu brakuje, więc: Czy ktoś wie, jak wygaśnie reszta moich stron?

+0

Co by działało równie dobrze byłoby, gdybym mógł wykluczyć cokolwiek poza pierwszą stroną z indeksowania, ponieważ prawie nikt nigdy nie obejrzy następnych stron ... – rogerkk

Odpowiedz

5

Wciąż jestem zainteresowany odpowiedzią na moje oryginalne pytanie i zmienię zaakceptowaną odpowiedź, jeśli pojawi się jakieś rozwiązanie. To powiedziawszy, skończyłem tylko buforowanie oryginalnej strony, sprawdzając, czy strona została podana w ogóle:

cache_action: index,: if => Proc.new {params [: page] .nil? }

+0

miła logika, bro – Mukesh

+0

Innym rozwiązaniem dla tego przypadku jest użycie opcja 'cache_path'. .. http://stackoverflow.com/a/2166419/1297435 –

1

Oto rozwiązanie, o którym myślałem, stojące przed tym samym problemem, chociaż jeszcze go nie wdrożyłem. Wstaw cache aktualny czas wygaśnięcia do własnego klucza. Kluczem może być kanoniczna reprezentacja wyszukiwanego adresu URL, tzn. Bez parametru "strona". np .:

Wyszukiwanie użytkownika na http://example.com?q=foo&page=3, więc params to { q: 'foo', page: 3 }. Usuń "page = 3" i pozostaniemy z {q: 'foo'}.

Uruchom na nim to_param i dodaj prefiks, a my pozostawiamy klucz pamięci podręcznej, taki jak search_expiry_q=foo.

Wyszukaj pamięć podręczną dla tego zapytania kanonicznego, np. Rails.cache.read (search_expiry_q=foo). Jeśli istnieje, sprawimy, że nasz wynik wygaśnie w tym momencie. Niestety, mamy tylko expires_in, a nie expires_at, więc będziemy musieli wykonać obliczenia. tj. coś takiego jak expires_in: expiry_time - Time.now - 5.seconds (5 sekund z nadzieją zapobiega wszelkim warunkom wyścigu). W ten sposób buforujemy pełny URL/params.

OTOH, jeśli nie ma wygaśnięcia, nikt ostatnio nie przeprowadził wyszukiwania. Tak więc:

expiry_time = Time.now + 1.hour 
Rails.cache.write(`search_expiry_q=foo`, expiry_time, expires_in: 1.hour) 

I cache ten fragment/strona, ponownie z pełnym adresem URL/params i expires_in: 1.hour.

Powiązane problemy