I was working like a fiend on a project, and forgot to add :id => false to a join table migration. For completeness, here’s the migration as it is supposed to look:

class CreateEmployeesRoles < ActiveRecord::Migration
  def self.up
    create_table :employees_roles, :id => false do |t|
      t.references :employee
      t.references :role

  def self.down
    drop_table :employees_roles

As I said, I forgot the :id => false, so it put a primary key on the table, which causes rails to error out with:

Primary key is not allowed in a has_and_belongs_to_many join table (employees_roles).

K, actually, the id column doesn’t really affect it, but heh it’s not needed, so let’s get rid of it.

Unfortunately, you can’t use rake db:rollback, it gives you the same error. Understandable, but technically, that is kind of a bug ala the random feature. If you make a mistake in your migration, ideal you should be able to rollback irregardless of table specific errors (That’s why you’re rolling back in the first place.)

In order to fix this, you’ll have to do it via MySQL:

$ mysql -u username -p yourapp_development
mysql> alter table your_table drop column id;

After that you can run:

$ rake db:rollback
$ rake db:migrate

And then you should be nice and fixed up.