Migration reports success but did not do anything

I observed this a few times, but not always happen, and if I down the
migration and run again, it often works.

My migration is really simple like:

Foo.find_each do |foo|
  foo.update_attribute(:bar, "baz")

Occasionally, it reports success, but not actually updated the
attribute for the "bar" column of Foo object. It appears to just skip
the whole thing and report success. And as I said, if I down it and
run again, it has always worked.

Anybody else has seen this problem before? I'm using Rails 3.0.10 but
I had this problem with older 3.0.x versions as well.

So whenever you migrate down and back up it works? Sounds like the migration is working properly then.

Under what circumstances does it not work?

That's exactly what I try to figure out. Migrations like this randomly
get "skipped" (reported success but didn't do anything).

It doesn't happen consistently (and doesn't happen most of time).

Failed validations? You do have to be a little careful when using
models in migrations. Consider this scenario:

- The migration above is written
- A new validation is written and a migration that fixes the data
already present in the database is written

if you try and run both of these migrations in one go then the updates
in the first migration fail, because the latest validations are used.
if you try and run the migration a second time they succeed because by
now the data fixing migration has run. The way to get around this
particular problem is to use copies of the model in your migration
(the migrations guide on guides.rubyonrails.org discusses this)