ruby - 如何在运行时在 ruby​​ 中设置命名空间?

标签 ruby activerecord module namespaces metaprogramming

我有一个通过命令行实用程序使用的基于 ActiveRecord 的应用程序。在这样的应用程序中为模型命名空间有利于保持对象命名空间干净。

我开始围绕这些 ActiveRecord 模型构建一个 rails 应用程序,虽然我已经克服了在命名空间中使用模型的一些初始问题,但我发现事情比我想要的要冗长。

我想要的是在命令行实用程序中以编程方式为我的 ActiveRecord 类设置命名空间,并在 Rails 应用程序中使用时以编程方式不为这些模型设置命名空间。

我知道文件本身可以在运行时在需要之前进行更改,但我正在寻找 Ruby 语言本身中的某些内容来干净利落地完成此操作。

最佳答案

很难在没有看到一些代码的情况下提供很好的建议,但这里有两种可能性。

  • 听起来您有两个客户端用于此代码。也许让它成为一个引擎(只是一个花哨的 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”给出了一些有希望的结果,看起来它只是 Hook 到 Ruby 的自动加载——虽然我认为这在 Ruby 2.0 中会消失)最坏的情况,您可以定义一个 railtie 来为您急切加载目录。这有点出乎我的意料,但我假设您需要在应用程序初始化之前定义的 railtie,因此您可能需要在 config/application.rb 中要求 railtie

    不幸的是,在一天结束的时候,当你开始偏离 Rails 约定时,生活开始变得艰难,所有你从未想过的魔法都崩溃了,所以你突然不得不深入 Rails 代码库来弄清楚它是什么正在做。

    关于ruby - 如何在运行时在 ruby​​ 中设置命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12230982/

    相关文章:

    ruby 模板 : How to pass variables into inlined ERB?

    Python:从项目层次结构中同一级别的另一个目录导入模块

    javascript - npm install 的工作原理

    ruby-on-rails - 创建模型实例时如何建立 has_and_belongs_to_many 关联

    ruby-on-rails - rake 数据库 :schema:dump doesn't provide data migration info - is there an automated way to get this?

    python - 当我分享我的使用 pip 的 python 项目时,我如何确保用户安装了 pip 程序?

    ruby-on-rails - Rails ORM 是否限制执行聚合的能力?

    ruby - 为什么 `rescue`默认不能捕获 `StandardError`以外的异常类?

    ruby - 如何跟踪和检查 bundle 的 Ruby gem 中的依赖项

    ruby-on-rails - 在 Rails 控制台中处理 Time.now