gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:55:01 25 4
gpt4 key购买 nike

我有一个通过命令行实用程序使用的基于 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com