Ruby on Rails
Sunday, December 4, 2016
On Sunday, December 4, 2016 at 9:00:04 PM UTC, Brian Christian wrote:
Okay, so my issue here is:If the cache key is just based on the Posts, then the controller code will pull the Authors association for no reason (we don't actually need it, because the author names are cached until the Post models are touched). This makes me think I should remove the .includes() call from my controller, since it will cause an unnecessary db query 99% of the time.On the other hand, if I remove the .includes() call from my controller, then whenever the cache does expire, I have an n-queries situation, which also seems bad.Is there any way to have the best of both worlds here?
The :preload variant of includes can be run after the query has run -
ActiveRecord::Associations::Preloader.new.preload(@recent, :authors)
Will load that association on @recent (you can preload multiple or nested associations in the same way. You could do this once you've gone down the cache miss case.
A related question:I've also found it helpful to use lower-level caching in my Post model to cache the "recent" query like so:post.rb
self.recent do
Rails.cache.fetch('recent_posts', expires_in: 1.day) do order(created_at: :desc).
self.to_a
end
endHere I have a similar problem. If I don't include the `.to_a` at the end, then I'm only caching the scope, which will still evaluate and seemingly (at least in development) trigger a db query on every pageview. If I do include the `.to_a` then I forfeit the ability to use `.includes()` in my individual controller actions or views.Again, is there a way to have the best of both worlds here?
You can use the same trick here.
Fred
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/92233b62-e866-43ae-94ac-3bb029c0ef92%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment