很难在没有看到一些代码的情况下提供一个很好的建议,但这里有两种可能性。
听起来您有两个用于此代码的客户端。也许让它成为一个引擎(只是一个花哨的 gem),你可以将你的路径添加到自动加载路径,然后从 gem 中使用它,而不会妨碍所有的轨道废话。
也许创建一个常量,然后在模型中重新打开它:
在一些初始化程序中
ActualNamespace = Class.new
DynamicNamespace = ActualNamespace
在您的模型文件中
class DynamicNamespace
class MyModel
end
end
DynamicNamespace::MyModel # => ActualNamespace::MyModel
然后为您的命令行应用程序
DynamicNamespace = Object
这与没有命名空间相同:
DynamicNamespace::MyModel # => MyModel
现在,您可能会在很大程度上基于反射的 Rails 魔法中遇到困难。我不完全知道您将面临什么,但我希望表单在提交数据时开始生成错误的键。您可以通过DynamicNamespace.name
按照这些思路定义某些东西或某些东西来解决这个问题。
自动加载,也可能成为一个问题,但我认为你可以以某种方式声明自动加载路径(我不确定,但谷歌搜索“rails autoloading”给出了一些有希望的结果,看起来它只是挂钩到 Ruby 的自动加载 - 虽然我认为这在 Ruby 2.0 中会消失)最坏的情况下,您可能可以定义一个 railtie 来为您急切地加载目录。这有点不符合我的要求,但我假设您需要在应用程序初始化之前定义的 railtie,所以您可能需要在 config/application.rb 中使用 railtie
不幸的是,在一天结束时,当你开始偏离 Rails 约定时,生活开始变得艰难,所有你从未想过的魔法都崩溃了,所以你突然不得不深入到 Rails 代码库中找出它是什么正在做。