Trailing commas are bad m'kay?
I had a pretty standard migration, which included something like the following two lines:
create_table :my_widgets do |t|
t.string :name, :colour, :flavour
t.integer :supplier_id
t.integer :height, :width, :depth, # note this extra comma...
t.timestamps
end
Looked fine at a casual glance, ran just fine - no hiccups. Been using it on dev for a week or so now... no problems... Only noticed an issue when I glanced at db/schema.rb
create_table "service_report_stats", :force => true do |t|
t.string "name"
t.string "colour"
t.string "flavour"
t.integer "supplier_id"
t.integer "height"
t.integer "width"
t.integer "depth"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "#<ActiveRecord::ConnectionAdapters::TableDefinition:0xb5c35504>" # WTF???
end
Something seriously wrong with that last "integer" column... mysql shows that yes, that is actually the column's real name:
+-----------------------------------------------------------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------------------------------------------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| supplier_id | int(11) | YES | | NULL | |
.... etc ...
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
| #<ActiveRecord::ConnectionAdapters::TableDefinition:0xb5c35504> | int(11) | YES | | NULL | |
+-----------------------------------------------------------------+----------+------+-----+---------+----------------+
Right now I have NFI how to actually remove the column... because trying:
alter table my_widgets drop column #<ActiveRecord::ConnectionAdapters::TableDefinition:0xb5c35504>;
Just results in: ERROR 1064 (42000): You have an error in your SQL syntax; , and it won't accept it if I put it in quotes either... so the column currently remains as is.
Luckily I was playing with a branch of the real system - so it's only my dev-box's code that has been mucked about... and I can change the migration before anybody else uses it... but this is seriously weird behaviour on Rails' part. Not a raised exception or even a raised eyebrow... it sailed right through and is continuing on regardless.
To actually fix it, I had to create a migration with the following:
remove_column :my_widgets, "#<ActiveRecord::ConnectionAdapters::TableDefinition:0xb5c35504>"
Seems the Rails itself can tell mysql about a weirdly-named column somehow. I'd still like to know the actual SQL involved...