JohnMerlino
JohnMerlino

Reputation: 3928

rails - using Rails.cache gives error

I'm trying to cache an expensive query that is reused in several requests throughout the site in Rails 3.

When a user clicks a table to view reports or when a user clicks to view a map or when a user clicks to print something, this query is performed:

reports.where{(time > my{range.begin}) & (time < my{range.end})}

It's an expensive query that can result in thousands of records. I want to cache it so after the first time it is called, it is stored in the cache until one of the records in the query is modified (e.g. updated).

I replace my query with this:

Rails.cache.fetch('time_reports') { reports.where{(time > my{range.begin}) & (time < my{range.end})} }

But it raises an exception:

TypeError (can't dump anonymous class #<Module:0x007f8f92fbd2f8>):

As part of the question, I would like to know if using Rails.cache.fetch also requires me to add the following in config/environments/production.rb:

config.cache_store = :mem_cache_store, "cache-1.example.com", "cache-2.example.com" //obviously I would use my ip

Upvotes: 2

Views: 1821

Answers (1)

Veraticus
Veraticus

Reputation: 16064

You're trying to dump an Arel relation into your cache store, which unfortunately is not possible. You want to dump the resulting array, so do this instead:

Rails.cache.fetch('time_reports') { reports.where{(time > my{range.begin}) & (time < my{range.end})}.all }

...or...

Rails.cache.fetch('time_reports') { reports.where{(time > my{range.begin}) & (time < my{range.end})}.to_a }

That will cause the relation to become a real array, which you can store in memcached as per normal.

Upvotes: 6

Related Questions