Ruby已经在使用我的模型的类名

时间:2010-04-22 20:45:46

标签: ruby-on-rails ruby class namespaces conflict

我正在制作一个具有各种授权级别的论坛应用程序,其中一个是Monitor。我这样做是通过扩展我的User类来实现的,我计划用“-ship”类(例如管理员,作者,主持人等)对其进行微调。显然,Monitor类是ruby mixin的一部分。如何在没有冲突的情况下保留我的资源名称?

3 个答案:

答案 0 :(得分:6)

一些可能性:

  • 避免调用标准的Monitor实例
  • 中的require 'monitor.rb'调用
  • 执行一些运行时魔术来重命名现有的Monitor类。
  • 带有您的加载路径的猴子,以便require 'monitor.rb'拉入一个空的Monitor实现。

但在所有情况下,您最终可能会遇到第三方库正在使用Monitor的情况,期望它是标准的Monitor类。所以,我建议反对以上任何一个。

我说你唯一合理的选择是:

A)你可以将你的类放在命名空间中:

Module MyApp
  class Monitor
    #...
  end
end

如果您的应用使用某种自动需要的魔法(例如它是一个rails应用),那么您可以将您的实现放在/my_app/monitor.rb中。如果你想引用那个类,你会做my_monitor = MyApp::Monitor.new()或其他什么。

B)你可以使用不同的类名:)

答案 1 :(得分:2)

在其他模块中声明您的Monitor类。

module MyModule

  class Monitor

  end

end

答案 2 :(得分:2)

仅供参考,我刚刚发现了一个巧妙的技巧(错误,黑客)来解决这个问题。

我在一个大型的遗留应用程序上工作,遗憾的是,它有一个非常重要且随处可用的“Fixture”模型。运行测试时,由于ActiveRecord在运行测试时使用了Fixture类,因此无法创建Fixture实例。所以我做了以下事情:

FixtureModel = Fixture.dup

这会冻结我的类,以便我可以稍后引用它(但只是在我的测试中!)而不是由ActiveRecord Fixture类(它没有命名空间)扩展