Ruby 已经在使用我的模型的类名
Posted
技术标签:
【中文标题】Ruby 已经在使用我的模型的类名【英文标题】:Ruby is already using the class name of my model 【发布时间】:2011-02-11 06:25:06 【问题描述】:我正在制作一个具有各种授权级别的论坛应用程序,其中之一是 Monitor。我通过扩展我的 User 类来做到这一点,并且我计划使用“-ship”类(例如管理员、作者、主持人等)对其进行微调。显然 Monitor 类是 ruby mixin 的一部分。如何在不发生冲突的情况下保留资源名称?
【问题讨论】:
【参考方案1】:在其他模块中声明你的 Monitor 类。
module MyModule
class Monitor
end
end
【讨论】:
如果您要对类进行命名空间,则不需要MyModule::
。
并将这个文件放到app/models/my_module/monitor.rb下
我应该对所有用户孩子都这样做吗?另外,模块类不应该从 User 继承吗(例如 class Monitor
@ryan 所以假设我要调用这个模块层次结构,你告诉我把我的模型放在 app/models/hierarchy/monitor.rb 中,这会起作用吗?如果在模块中定义了这个文件,为什么我还需要这个文件?【参考方案2】:
一些可能性:
避免在标准 Monitor 实例中调用require 'monitor.rb'
使用一些运行时魔法来重命名现有的 Monitor 类。
monkey 与您的加载路径,以便require 'monitor.rb'
拉入 Monitor 的空实现。
但在所有情况下,您最终都可能遇到第 3 方库使用 Monitor 并期望它是标准 Monitor 类的情况。所以,我建议不要使用上述任何一种。
我想说你唯一的两个合理的选择是:
A) 你可以把你的类放在一个命名空间中:
Module MyApp
class Monitor
#...
end
end
如果您的应用程序使用某种自动请求魔法(例如它是一个 Rails 应用程序),那么您可以将您的实现放在 /my_app/monitor.rb 中。当您想引用该类时,您可以执行my_monitor = MyApp::Monitor.new()
之类的操作。
B) 你可以使用不同的类名:)
【讨论】:
如上所述 (MyModule::),在实现这些类之后,我将如何引用它们?我之前读过一些关于模块和 mixin 的文章,但我从未使用过我在应用中制作的自定义模块。 我编辑了我的答案以包含有关命名空间方法的更多详细信息。希望这能让你更清楚。 很好,我也喜欢建议 B...我会试试这个,如果成功就接受。 Tony 好像不对。新模块在级联中不优先。选项 B 看起来越来越好......【参考方案3】:仅供参考,我刚刚找到了一个巧妙的技巧(错误,hack)来解决这个问题。
我在一个大型遗留应用程序上工作,不幸的是,它有一个“夹具”模型,它非常重要并且到处都在使用。运行测试时,由于 ActiveRecord 在运行测试时使用了 Fixture 类,因此无法创建 Fixture 实例。所以我做了以下事情:
FixtureModel = Fixture.dup
这将我的类冻结在适当的位置,以便我以后可以引用它(但只是在我的测试中!)而不会被 ActiveRecord Fixture 类(未命名空间)扩展
【讨论】:
以上是关于Ruby 已经在使用我的模型的类名的主要内容,如果未能解决你的问题,请参考以下文章