2009-09-27 120 views
8

我試圖定義一個內遷移的方法,但我發現了一個未定義的方法錯誤:定義方法

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

我寧願不別處定義它,因爲它不」這與應用程序的其他部分無關,只是這種特定的遷移。

需要明確的是,我的移民看起來像:

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 

我失去了一些東西在這裏?爲什麼我不能像這樣定義這個?

回答

8

正如您從錯誤消息中看到的,代碼不是從您的遷移類中調用的,而是在連接適配器內調用的。我不知道,但這個小變化應該工作:

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 

請注意,我做你的方法靜態的,稱它以靜態方式。這應該克服任何類範圍問題。

+0

是的,我不明白它是從適配器內部調用它,但我認爲它應該仍然在它的範圍內。無論如何,現在我得到一個錯誤未定義的方法'do_something_specific'爲類:類 – 2009-09-27 20:03:04

+0

D'哦對不起。由於'self.up'本身就是一個靜態方法,對'class'的調用將返回'Class'而不是'DoSomethingSpectacular'。我更新了示例代碼。 – Koraktor 2009-09-27 20:24:08

+2

我認爲你可以安全地刪除'DoSomethingSpectacular。'。在self.up – khelll 2009-09-28 03:23:16