views:

160

answers:

1

I'm trying to define a method inside a migration, but I'm getting an undefined method error:

undefined method 'do_something_specific' for #<ActiveRecord::ConnectionAdapters::SQLite3Adapter:0x4868018>

I'd rather not define it elsewhere, because it doesn't really relate to the rest of the application, just this specific migration.

To be clear, my migration looks something like:

class DoSomethingSpectacular < ActiveRecord::Migration

  def self.up
    do_something_specific(1, 2)
  end

  def self.down
  end

private

  def do_something_specific(p_1, p_2)
    # something happens here...
  end

end

Am I missing something here? Why can't I define this like this?

+1  A: 

As you may see from the error message the code isn't called from within your migration class but inside the connection adapter. I'm not sure, but this small change should work:

class DoSomethingSpectacular < ActiveRecord::Migration

  def self.up
    DoSomethingSpectacular.do_something_specific(1, 2)
  end

  def self.down
  end

private

  def self.do_something_specific(p_1, p_2)
    # something happens here...
  end

end

Note that I made your method static and called it in a static way. This should overcome any class scope issues.

Koraktor
Yeah I didn't understand what it was calling it from within the adapter, but I figured it should still be within it's scope. Anyway, now I get an error undefined method 'do_something_specific' for Class:Class
Jon Smock
D'oh sorry. As `self.up` is a static method itself, the call to `class` will return `Class` and not `DoSomethingSpectacular`. I updated the sample code.
Koraktor
I think you can safely remove the 'DoSomethingSpectacular.' in self.up
khelll