1

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

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

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

我知道文件本身可以在需要之前在运行时进行更改,但我正在寻找 Ruby 语言本身的一些东西来干净地完成这一点。

4

1 回答 1

2

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

  1. 听起来您有两个用于此代码的客户端。也许让它成为一个引擎(只是一个花哨的 gem),你可以将你的路径添加到自动加载路径,然后从 gem 中使用它,而不会妨碍所有的轨道废话。

  2. 也许创建一个常量,然后在模型中重新打开它:

在一些初始化程序中

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 代码库中找出它是什么正在做。

于 2012-09-02T02:07:31.023 回答