我最近得知“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在底层做了什么,这使得以这种方式调用静态方法是一个坏主意?
答案 0 :(得分:1)
每次在应用程序处于开发模式时发出请求时,都会重建模型本身,因此对旧类或其实例的任何延迟引用都将变为无效,并且如果有的话将无法正常工作。
让事情自动重新加载可能很棘手,但可以做到。这取决于你想要做什么。
由于app/
结构中的几乎所有内容都会自动重新加载,因此您也可以通过重新加载扩展程序来解决此问题。 lib/
中的内容不会重新加载,可能会导致冲突。
我认为这里的主要问题是lib/
中的扩展将解析类并保留该引用,即使在后续加载时替换了类。
如果您需要执行此类操作,无法通过将扩展程序移至app/models
来解决此问题,您是否可以提供有关您正在尝试执行的操作的详细信息?