Bird
Raised Fist0
Ruby on Railsframework~10 mins

Low-level caching with Rails.cache - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Low-level caching with Rails.cache
Call Rails.cache.fetch(key)
↓
Check if key exists in cache
↓
Return cached value
↓
Store value in cache
↓
Return new cached value
Rails.cache.fetch checks if a key exists. If yes, it returns cached data. If no, it runs the block, stores the result, then returns it.
Execution Sample
Ruby on Rails
value = Rails.cache.fetch('greeting') do
  'Hello, world!'
end
puts value
This code tries to get 'greeting' from cache; if missing, it stores and returns 'Hello, world!'.
Execution Table
StepActionCache Key Exists?Block Executed?Cache Store Updated?Returned Value
1Call Rails.cache.fetch('greeting')NoYesYes'Hello, world!'
2Call Rails.cache.fetch('greeting') againYesNoNo'Hello, world!'
💡 Execution stops after returning cached value on second fetch call.
Variable Tracker
VariableStartAfter Step 1After Step 2
cache['greeting']nil'Hello, world!''Hello, world!'
valuenil'Hello, world!''Hello, world!'
Key Moments - 2 Insights
Why does the block run only the first time?
Because in step 1, the cache key 'greeting' does not exist, so the block runs and stores the value. In step 2, the key exists, so the block is skipped (see execution_table rows 1 and 2).
What happens if the cache key expires or is cleared?
Rails.cache.fetch will treat it like a missing key, run the block again, store the new value, and return it, similar to step 1 in the execution_table.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the returned value at step 2?
ABlock content not returned
B'Hello, world!'
Cnil
DError
💡 Hint
Check the 'Returned Value' column in execution_table row 2.
At which step does the cache store get updated?
AStep 2
BBoth steps
CStep 1
DNever
💡 Hint
Look at 'Cache Store Updated?' column in execution_table.
If the cache key 'greeting' is deleted before step 2, what happens?
ABlock runs again and cache updates
BBlock is skipped and nil returned
CError is raised
DOld cached value returned
💡 Hint
Refer to key_moments about cache expiration and step 1 behavior.
Concept Snapshot
Rails.cache.fetch(key) checks cache for key.
If found, returns cached value immediately.
If missing, runs block, stores result, returns it.
Blocks run only when cache miss occurs.
Useful for fast repeated data access.
Full Transcript
Low-level caching with Rails.cache uses the fetch method to check if a cache key exists. When you call Rails.cache.fetch with a key, it first looks in the cache. If the key is found, it returns the cached value without running the block. If the key is not found, it runs the block, stores the block's result in the cache under that key, and returns the new value. This means the block runs only once per cache miss. Subsequent calls with the same key return the cached value quickly. If the cache is cleared or the key expires, the block runs again to refresh the cache. This pattern helps speed up applications by avoiding repeated expensive operations.

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

  1. Step 1: Understand the role of caching

    Caching stores data temporarily to avoid repeating expensive operations.
  2. Step 2: Identify what Rails.cache does

    Rails.cache provides a way to store and retrieve data quickly in memory or other stores.
  3. Final Answer:

    To store data temporarily for faster repeated access -> Option B
  4. 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

  1. 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.
  2. Step 2: Check other options for correctness

    get, store, and read do not accept a block to compute missing values automatically.
  3. Final Answer:

    Rails.cache.fetch(:key) { expensive_method } -> Option C
  4. 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

  1. 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.
  2. Step 2: Understand the second fetch call

    The key 'counter' exists now, so fetch returns cached value 1 without running the block.
  3. Final Answer:

    1 -> Option D
  4. 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

  1. 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.
  2. Step 2: Check other options for validity

    Using string keys is valid; fetch block can call User.find; write order is not mandatory here.
  3. Final Answer:

    Calling write without a value argument causes an error -> Option A
  4. 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

  1. Step 1: Identify correct option for expiration

    expires_in: 10.minutes is the correct option to set cache expiration time in fetch.
  2. 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.
  3. Final Answer:

    Rails.cache.fetch('products', expires_in: 10.minutes) { Product.all.to_a } -> Option A
  4. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard