2010-11-16 64 views
3

當我的系統需要兩個同名的類或模塊時,我能做些什麼來指定我的意思?Ruby:導入兩個相同名稱的模塊

我正在使用rails(新增功能),並且我的一個模型被命名爲「Thread」。當我嘗試引用thread_controller.rb中的「Thread」類時,系統會返回一些其他具有相同名稱的常量。

<thread.rb> 
class Thread < ActiveRecord::Base 

    def self.some_class_method 
    end 

end 

<thread_controller.rb> 
class ThreadController < ApplicationController 

    def index 
    require '../models/thread.rb' 
    @threads = Thread.find :all 
    end 

end 

當我嘗試使用Thread.find()時,我得到一個錯誤,表示Thread沒有名爲find的方法。當我訪問Thread.methods時,我沒有發現我的some_class_method方法。

任何幫助? (並且不要打擾張貼「只是命名你的模型別的東西」。指出明顯的妥協是沒有幫助的。)

回答

2

您可以將您的應用放入自己的名稱空間。

<my_app/thread.rb> 
module MyApp 
    class Thread 
    end 
end 
2

沒有,真的,請爲你的模型命名。

Thread是Ruby中的一個保留常量,並且重寫該常量只會讓你遇到麻煩。我妥協了my application,並將其改爲Topic

+0

好的。這比通常的「改變你的名字」的迴應要好。謝謝。 ...但是,我想知道一個更一般的答案,在不處理保留常量重複的情況下可以使用這個答案。 – JellicleCat 2010-11-16 03:14:38

2

如果你絕對必須覆蓋現有的常量,你可以做這樣的事情:

# use Object to make sure Thread is overwritten globally 
# use `send` because `remove_const` is a private method of Object 
# Can use OldThread to access already existing Thread 
OldThread = Object.send(:remove_const, :Thread) 

# define whatever you want here 
class MyNewThread 
    ... 
end 

# Now Thread is the same as MyNewThread 
Object.send(:const_set, :Thread, MyNewThread) 

顯然,任何在預先存在的Thread會被打掉依賴,除非你做了某種猴子打補丁的。

只因爲這種事情可以做到,並不代表它應該是。但在某些情況下,它可以很方便,例如在測試中,您可以用自己的「啞」對象覆蓋遠程數據源。

相關問題