2012-09-01 32 views
1

我有一個基於ActiveRecord的應用程序通過命令行工具使用。在這樣的應用程序中命名空間模型有利於保持對象名稱空間的清潔。如何在運行時在ruby中設置命名空間?

我開始圍繞這些ActiveRecord模型構建rails應用程序,雖然我已經克服了在命名空間中使用模型時遇到的一些初始問題,但我發現事情比我想要的要冗長。

我想要的是在命令行實用程序中使用programmaticaly爲我的ActiveRecord類設置命名空間,並在Rails應用程序中使用時爲programmaticaly未設置這些模型的命名空間。

我知道文件本身可以在運行前在需要的時候改變,但我正在尋找Ruby語言本身的東西來完成這個乾淨。

+1

如果你問我,這個解決方案只是感覺錯誤。你可以在rails應用程序中顯示一些你不喜歡的例子嗎? –

+0

路線稍微複雜一點,但可以算出來。URL助手變得相當詳細。像TestStats命名空間中的Listname和/或Task模型一樣:test_stats_listnames_path(),test_stats_listname_tasks_path(),new_test_stats_listname_task_path() – Ben

+0

我理解你對這種感覺錯誤的看法。但是,從ActiveRecord模型的角度來看,它們本身都是封裝在gem中的,這對於gem的各種用戶來說會很好。 CLI工具開發人員會喜歡命名空間,因爲gem可能只是該工具的一小部分。雖然rails應用程序開發人員的世界將圍繞使命名空間不那麼有用/必要的模型。 – Ben

回答

2

很難提供一個很好的建議,但沒有看到一些代碼,但這裏有兩種可能性。

  1. 這聽起來像你有兩個客戶對這個代碼。也許使它成爲一個引擎(只是一個奇特的寶石),你可以添加你的路徑到自動加載路徑,然後在沒有任何障礙的情況下使用它。

  2. 也許創建一個常量,然後重新打開它的模型:在你的模型文件

在一些初始化

ActualNamespace = Class.new 
DynamicNamespace = ActualNamespace 

class DynamicNamespace 
    class MyModel 
    end 
end 

DynamicNamespace::MyModel # => ActualNamespace::MyModel 

那麼對於您的命令行應用程序

DynamicNamespace = Object 

哪一樣沒有命名空間:

DynamicNamespace::MyModel # => MyModel 

現在,你可能會風具有一定的Rails的魔術,這在很大程度上是基於反射的困難。我不完全知道你會面對什麼,但我希望表單在提交數據時開始生成錯誤的鍵。你可以通過定義DynamicNamespace.name或其他的東西來解決這個問題。自動加載,也可能成爲一個問題,但我認爲你可以以某種方式聲明自動加載路徑(我不知道,但谷歌搜索「軌道自動加載」提供了一些有希望的結果,看起來像它只是鉤到Ruby的自動加載 - 儘管我認爲這會在Ruby 2.0中消失)最糟糕的情況是,您可能需要定義一個railtie,以便爲您加載dirs。這一切都是我的聯盟,但我認爲你需要在應用程序初始化之前定義的railties,所以你可能需要在配置/ application.rb中需要railtie

不幸的是,在那一天,當你開始偏離Rails約定時,生活開始變得艱難,而你從來沒有想過的所有魔法都會崩潰,所以你突然不得不跳入Rails代碼庫來找出它在做什麼。

+0

這正是我正在尋找的。感謝Joshua。根據DynamicNamespac == Object的返回值,我沒有看到Rails如何知道與常規的無名稱類的區別。實驗會證明確實。如果我遇到它,我會在這裏報告以警告其他人麻煩。 – Ben

相關問題