We've pretty much reached the conclusion that ActiveRecord::Base.all, or .find(:all) if you prefer, should never be used without conditionals. If you want to iterate over every record in the table, you should use my custom .foreach method.
Some recent site flakiness inspired me to do some comparisons of a .all vs a .foreach. The details are below. For the lazy, the short version is that a .all call will suck down rather large amounts of RAM and CPU, growing larger as the number of records grows. The .foreach call consumes about the same amount of CPU, but with low and steady RAM usage.
Table: Teacher
Overview:
61572 records.
28 columns, mostly varchar (character) fields of with a size of about 25, with one field at 4000 characters, but which is usually empty.
Memory: 163mb %62.5 CPU %7.61 MEM. Total time: About 30 seconds.
=> Teacher.foreach
Memory: 41mb %68.34 CPU %1.42 MEM Total time: About 38 seconds.
The figures I'm showing are what the process finally capped out at. The .all call starts off at 41mb and climbs until it finishes the process, while the .foreach call sits steady at 41mb, though its CPU usage climbs about as much as the .all call.
This, of course, will only get worse on tables with larger datasets, and will absolutely hammer your server. Frankly, I think the find_each implementation ought to be the default implementation, though last I checked CPK broke it.