An active record relation does not automatically load all records into memory.
When you call #each, all records will be loaded into memory. When you call #find_each, records will be loaded into memory in batches of the given batch size.
So when your query returns a number of records that would be too much memory for the server’s available resources, then using #find_each would be a great choice.
It’s basically like using ruby’s lazy enumeration #to_enum#lazy with #each_slice and then #each (very convenient).