解决类与 gem 之间的命名空间冲突

3
在我的Rails 2.3应用程序中,我发现问题源于现有的ActiveRecord模型和我最近添加的gem之间的命名空间冲突。具体而言,我试图向应用程序添加jammit支持。其中一个jammit的依赖gem需要"platform",这将在应用程序的命名空间中引入一个"Platform"模块。然而,我已经有了一个名为"Platform"的AR类,重命名它将引入大量额外的工作和可能的错误。我想知道是否有相对简单的方法(使用ruby的元编程或其他方法)可以防止这种命名空间冲突,而无需重命名我的类或改变实际的gem。谢谢。
编辑: 而不是在整个应用程序中重命名/包装类"Platform",由于模块"Platform"只被另一个gem所需,我选择分别fork这两个gem,将"Platform"重命名为"XPlatform"(原始gem和导入它的gem都要重命名),然后重新构建它们。这似乎起作用了[sigh]。
2个回答

4

如果条件不可避免,您无法更改名称

尝试将您的ActiveRecord类包装在一个模块中

module YourModule
 class Platform < Activerecord::Base
 named_scope :your_scope, lambda {#your code here}

 end
end

所以你需要做的唯一更改就是像这样:

YourModule::Platform.your_scope

看起来是个好主意,但最终我只是复制我需要的 gem 并将它们的名称改为不冲突的(请参见我的编辑)。这样可以解决问题,直到其他 gem 需要它们...但这种情况发生的可能性并不大。谢谢! - sa125
@sa125 很好.. 但是当这个 gem 有新版本时,你会怎么做呢?你会一直将你的 fork 上游到源头以保持更新吗? - AnkitG
这两个特定的宝石(platformpopen4)已经2-3年没有更新了,而且我在可预见的未来可能不需要新版本。到那时,我希望升级到Rails 3.x或更高版本,并内置sprockets :) - sa125

0
在执行任何操作之前,你可以在类的顶部创建一个别名。
NewPlatform = ActiveRecord::
然后在该类的动作中使用别名来避免命名空间冲突。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接