Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Expand caveat about models in migrations (rails guide)

This is an attempt to address issue #6939, where an earlier migration
added a column to the database, and a later migration uses a model and
references that column.

When both migrations were run together with `rake db:migrate` the column
information in memory still referenced the old table structure.

Running the migrations separately fixed this, as a new connection was
then established before referencing the model. Explicitly calling
`reset_column_information` is a more reliable workaround.
  • Loading branch information...
commit a1d2f693776952e1f6ca7b347919047dbb4617f2 1 parent ecf460e
@kytrinyx kytrinyx authored
Showing with 21 additions and 0 deletions.
  1. +21 −0 guides/source/
21 guides/source/
@@ -889,6 +889,27 @@ class AddFuzzToProduct < ActiveRecord::Migration
+There are other ways in which the above example could have gone badly.
+For example, imagine that Alice creates a migration that selectively
+updates the +description+ field on certain products. She runs the
+migration, commits the code, and then begins working on the next feature,
+which is to add a new column +fuzz+ to the products table.
+She creates two migrations for this new feature, one which adds the new
+column, and a second which selectively updates the +fuzz+ column based on
+other product attributes.
+These migrations run just fine, but when Bob comes back from his vacation
+and calls `rake db:migrate` to run all the outstanding migrations, he gets a
+subtle bug: The descriptions have defaults, and the +fuzz+ column is present,
+but +fuzz+ is nil on all products.
+The solution is again to use +Product.reset_column_information+ before
+referencing the Product model in a migration, ensuring the Active Record's
+knowledge of the table structure is current before manipulating data in those
Schema Dumping and You
Please sign in to comment.
Something went wrong with that request. Please try again.