2010-09-17 31 views
7

我一直在構建一個執行記帳功能的Rails應用程序。作爲其中的一部分,我有一個類名爲Transaction的模型。到目前爲止,我一直在構建這個功能一個月左右,一切都按預期工作。解決Rails應用程序中的類名衝突問題

直到現在......

我剛剛發現這是幾個月前使用Ruport庫已停止工作開發了一些舊的報告功能。看起來,Ruport在生成PDF時需要一個庫,該庫也有一個名爲Transaction的類/模塊。

TypeError in Admin/team reportsController#generate 
Transaction is not a module 

... 

This error occurred while loading the following files: 
    pdf/writer 
    transaction/simple 

所以,我在這裏尋找一個快速修復。一個希望不涉及重命名我的Transaction模型和重構最後幾周的代碼。

期待一些聰明的建議:)

回答

7

我相信這個問題是到Ruport要求PDF ::編寫器寶石,它反過來需要定義模塊事務的Transaction :: Simple gem。

ActiveRecord當然有一個#transaction方法,但我不認爲Rails中有一個事務模塊或類。我很樂意在那個問題上予以糾正。

命名空間通常是避免像這樣命名衝突的最佳實踐。例如。

module Account 
    class Transaction < ActiveRecord::Base 
    .... 
    end 
end 

但是,命名空間的ActiveRecord模型可能嘔吐等問題。

儘管費時費力,重命名您的交易模型可能是最佳選擇。

如果您願意,您仍然可以保留現有的交易數據庫表,因此您的遷移無需更改,只需在模型中添加self.table_name = "transactions"即可。

通過在關聯調用中指定class_name,您與其他模型的關聯仍然可以被命名爲「事務」。例如。

class User < ActiveRecord::Base 

    has_many :transactions, :class_name => "AccountTransaction" 

end 

這兩個建議可能會也可能不會節省您一些時間。

+0

謝謝。我已經改變了你接受答案的答案,因爲它更準確地描述了我的具體問題 - 儘管亞尼斯,答案也是正確的!最後,我使用一些舊的skool查找和替換來重新命名我的模型,數據庫表和所有關聯;) – aaronrussell 2010-09-20 11:47:24

+0

在較新版本的Rails中,'set_table_name'只是'self.table_name =',請參見http: /api.rubyonrails.org/classes/ActiveRecord/ModelSchema/ClassMethods.html#method-i-table_name-3D – 2014-04-01 18:09:46

0

您的問題可能來自於一個事實,即交易也是Rails的一個保留字...

+0

是不是解決了嗎?該死的!但是,謝謝您通知我...... – aaronrussell 2010-09-17 13:29:15

+4

Rails只是一個Ruby庫,它不能將任何關鍵字添加到Ruby語言中。 – 2010-09-17 13:37:37

+1

它可能只是一個圖書館,但它可以限制使用它的事物的命名(即使這些原因不是由該語言強制執行的)。只要看看嘗試使用列名'type'時遇到的麻煩...... – 2013-03-05 10:08:49

13

已經回答了老,但我來到這裏有同樣的問題,但以不同的方式解決它。

我有兩個名爲Pull和Query的模型。 嘗試在Pull中的方法內引用Query.some_static_method()導致查詢解析爲ActiveRecord::AttributeMethods::Query:Module

通過將空的命名空間在它的前面有::Query.some_static_method()

+0

好的答案,不知道空的名字空間! – 2014-03-26 11:06:50

+0

優雅的解決方案。你能解釋一下爲什麼/它是如何工作的? – cph2117 2015-03-11 15:09:42

+0

@ cph2117,所有確實做的事情都是明確指出哪個名稱空間要查找「Query」。 – hometoast 2015-03-11 15:47:02