为什么不重新加载的模块不能自动调用自动重新加载的类中的静态方法?

时间:2011-04-21 15:22:40

标签: ruby-on-rails ruby

我最近得知“Klass的副本已从模块树中删除但仍处于活动状态”,http://makandra.com/notes/528-fixing-a-copy-of-klass-has-been-removed-from-the-module-tree-but-is-still-active完全解决了我的问题。我从一个调用静态MyModel.find方法的ActiveRecord类中包含一个模块。

我知道我可以通过几种不同的方式解决我的问题,但我想知道,Ruby在底层做了什么,这使得以这种方式调用静态方法是一个坏主意?

1 个答案:

答案 0 :(得分:1)

每次在应用程序处于开发模式时发出请求时,都会重建模型本身,因此对旧类或其实例的任何延迟引用都将变为无效,并且如果有的话将无法正常工作。

让事情自动重新加载可能很棘手,但可以做到。这取决于你想要做什么。

由于app/结构中的几乎所有内容都会自动重新加载,因此您也可以通过重新加载扩展程序来解决此问题。 lib/中的内容不会重新加载,可能会导致冲突。

我认为这里的主要问题是lib/中的扩展将解析类并保留该引用,即使在后续加载时替换了类。

如果您需要执行此类操作,无法通过将扩展程序移至app/models来解决此问题,您是否可以提供有关您正在尝试执行的操作的详细信息?