This controller action caches all products for 10 minutes. It avoids hitting the database on every request, speeding up the page load.
Ruby on Rails
class ProductsController < ApplicationController
def index
@products = Rails.cache.fetch('all_products', expires_in: 10.minutes) do
Product.all.to_a
end
end
end
OutputSuccess
Important Notes
Always use unique keys to avoid cache conflicts.
Set expiration times to keep cache fresh and avoid stale data.
Use Rails.cache.delete(key) to remove cache when data changes.
Summary
Low-level caching stores data with a unique key to speed up repeated access.
Use Rails.cache.fetch with a block to cache data easily.
Remember to manage cache expiration and invalidation for fresh data.
Practice
(1/5)
1. What is the main purpose of using Rails.cache in a Rails application?
easy
A. To permanently save data to the database
B. To store data temporarily for faster repeated access
C. To send emails asynchronously
D. To handle user authentication
Solution
Step 1: Understand the role of caching
Caching stores data temporarily to avoid repeating expensive operations.
Step 2: Identify what Rails.cache does
Rails.cache provides a way to store and retrieve data quickly in memory or other stores.
Final Answer:
To store data temporarily for faster repeated access -> Option B
Quick Check:
Caching = Temporary storage for speed [OK]
Hint: Caching speeds up repeated data access by storing it temporarily [OK]
Common Mistakes:
Confusing caching with permanent database storage
Thinking caching handles user login
Assuming caching sends emails
2. Which of the following is the correct syntax to fetch a cached value or compute and store it if missing using Rails.cache?
easy
A. Rails.cache.store(:key, expensive_method)
B. Rails.cache.get(:key) { expensive_method }
C. Rails.cache.fetch(:key) { expensive_method }
D. Rails.cache.read(:key) { expensive_method }
Solution
Step 1: Recall the fetch method usage
Rails.cache.fetch(:key) { block } tries to read the key, or runs the block and stores the result if missing.
Step 2: Check other options for correctness
get, store, and read do not accept a block to compute missing values automatically.
Final Answer:
Rails.cache.fetch(:key) { expensive_method } -> Option C
Quick Check:
Use fetch with block to cache missing data [OK]
Hint: Use fetch with a block to cache or compute missing data [OK]
Common Mistakes:
Using read or get which don't accept blocks
Trying to use store with a block
Confusing fetch with read
3. Given the code below, what will be printed by the second Rails.cache.fetch('counter') call?
count = 0
Rails.cache.fetch('counter') do
count += 1
end
puts Rails.cache.fetch('counter')
medium
A. nil
B. 0
C. 2
D. 1
Solution
Step 1: Understand the first fetch call
The block runs because 'counter' key is missing, so count increments from 0 to 1 and stores 1.
Step 2: Understand the second fetch call
The key 'counter' exists now, so fetch returns cached value 1 without running the block.
Final Answer:
1 -> Option D
Quick Check:
Cached value returned without block run = 1 [OK]
Hint: Cached value returns without running block again [OK]
Common Mistakes:
Assuming block runs every time
Thinking count resets to 0
Expecting nil if key exists
4. Identify the error in this caching code snippet:
Rails.cache.fetch('user_1') do
User.find(1)
end
Rails.cache.write('user_1')
medium
A. Calling write without a value argument causes an error
B. fetch block should not call User.find
C. The cache key must be a symbol, not a string
D. write should be called before fetch
Solution
Step 1: Analyze the write method usage
Rails.cache.write requires a key and a value; here only the key is given, missing the value argument.
Step 2: Check other options for validity
Using string keys is valid; fetch block can call User.find; write order is not mandatory here.
Final Answer:
Calling write without a value argument causes an error -> Option A
Quick Check:
write needs key and value [OK]
Hint: write needs both key and value arguments [OK]
Common Mistakes:
Omitting value in write method
Thinking keys must be symbols
Misunderstanding fetch block usage
5. You want to cache a list of products but ensure the cache expires after 10 minutes. Which is the correct way to do this with Rails.cache.fetch?
hard
A. Rails.cache.fetch('products', expires_in: 10.minutes) { Product.all.to_a }
B. Rails.cache.fetch('products', expires: 10) { Product.all }
C. Rails.cache.write('products', Product.all, expires_in: 600)
D. Rails.cache.fetch('products', timeout: 600) { Product.all.to_a }
Solution
Step 1: Identify correct option for expiration
expires_in: 10.minutes is the correct option to set cache expiration time in fetch.
Step 2: Check other options for correctness
expires and timeout are not valid options; write can set expiration but fetch with block is preferred for caching computed data.
Final Answer:
Rails.cache.fetch('products', expires_in: 10.minutes) { Product.all.to_a } -> Option A
Quick Check:
Use expires_in with fetch for expiration [OK]
Hint: Use expires_in option with fetch to set cache lifetime [OK]
Common Mistakes:
Using wrong option names like expires or timeout
Not converting ActiveRecord relation to array
Using write instead of fetch with block
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.