This time it was migrations crash course….
Recently I had to change run-n-share database structure and remove some models. I needed to find easy way to do changes in DB and make data transformation. Of course I started doing it with migrations.
Quite successfully. With one exception.
Somewhere in migration I wrote following code:
Owner.find(:all).each {|o|
begin
r = Route.find(o[:route_id])
rescue
puts "#{o.route_id} not found in routes table"
next
end
[some operations on o and r]
}
Trouble is that no operation after begin/rescue is run – every iteration through Owners raises ‘undefined method find’. Most strange is Route class (I have AR model route!):
rake aborted! undefined method `find' for #<ActiveRecord::ConnectionAdapters::MysqlAdapter:0x8d9c2c4>
I know about Safely using models – in my case this is not useful, since I need access to real model properties to make data transition. Using dumb model stub would give me only access to methods inherited from ActiveRecord::Base, and this is not enough for me.
Well, I have started digging and at the end I’ve put in migration following code:
def self.up
puts ActiveRecord::Base::Route.superclass
puts ActiveRecord::Base::Owner.superclass
puts "Surprised?"
end
And ran migration. Results were:
ActiveRecord::Migration ActiveRecord::Base Surprised?
Well I’m surprised. Is this some special case with Route symbol? Like other issues I found during my short way with RoR:
https://nhw.pl/wp/2007/01/02/another-dumb-ror-restriction/
https://nhw.pl/wp/2006/05/30/dont-use-sessions-table-in-rails/
As a quick solution I have moved all data transformation to separate script run by ./script/runner and I break migrations flow raising exception to give chance run script in right moment. It is ugly hack, but it works…
If this is issue with some names clash (like with send action or sessions table) can somebody propose general solution? I don’t know Ruby and Rails enough to thought about feasible solution…
Leave a Reply