Próbuję buforować ActiveRecord z powiązaniem. Problem polega na tym, że istnieje zapytanie do bazy danych podczas uzyskiwania dostępu do powiązań w pobranym rekordzie.Buforowanie ograniczone skojarzenia
Zwykle po prostu przechowywałbym w pamięci podręcznej z obciążonym ładowaniem Rails.cache.write('post', Post.includes(:comments).find(99))
. To wydaje się działać, ale problem polega tylko na tym, że chcę buforować tylko ograniczony podzbiór skojarzeń, a limity są ignorowane, gdy przykłada się do nich ładowanie (na przykład: here). Tak więc Post.includes(:popular_comments).find(99)
zwróci wszystkie komentarze, a nie tylko te popularne.
Więc próbowałem buforowania obiektu po lazy-loading stowarzyszenia, ale niestety pojawia się, gdy kwerenda ciągnięcie obiekty z:
class Post < ActiveRecord::Base
has_many :comments
has_many :popular_comments, :class_name > 'Comment', :limit => 20, :order => :votes
post = Post.find(99)
post.popular_comments # lazy-load limited associations
Rails.cache.write('post', post)
...
Rails.cache.read('post').popular_comments # Unwanted SQL query :(
Próbowałem buforowanie klon Zamiast tego samego zapytania SQL niechciane . Próbowałem tego zarówno z implementacjami redis, jak i memcached, tym samym wynikiem. Dziwnie, ta sekwencja działa na konsoli afaict, ale proste użycie w kontrolerze lub widoku jak wyżej nie powiedzie się (np. SQL występuje).
Aktualizacja (kwiecień 2017): Chciałbym teraz powiedzieć, że to głupie założenie. Buforowanie całych obiektów jest generalnie marnotrawstwem, ponieważ wykorzystuje dużo pamięci podręcznej i jest wolne od serializacji/deserializacji. Również skojarzenia do buforowania (o które pytano w tym pytaniu) pomnażają te straty przez N. Zwykle bardziej wydajne jest po prostu buforowanie surowych identyfikatorów i fragmentów HTML.
Która wersja Railsa jest uruchomiona? – Brandan
@Bandan To jest na Rails 3.1 – mahemoff
Czy możesz opublikować fragment dziennika pokazujący dokładnie, co SQL jest wykonywane i gdzie w żądaniu to się dzieje? Nie mogłem tego odtworzyć. – Brandan