在 Ruby 中链接自动加载 类

Chaining autoloaded classes in Ruby

我在 user.rb 中有一个 class、User,将根据需要通过以下语句自动加载:

autoload :User, 'models/user.rb'

此模型在几个不同的代码库之间共享(作为 Git 子模块,如果有区别的话)。在一个这样的代码库中,我需要重新打开 User class 并添加一些方法。至少对我来说,这变得复杂的地方是我需要自动加载生成的扩展 class 来代替原始 class.

在 Ruby 中是否有链接自动加载的 classes 的模式?类似于:

autoload :User, ['models/user.rb', 'extended_models/user.rb']

或者我应该使用继承而不是猴子修补?我愿意接受建议。提前致谢。

如果它在多个代码库之间共享,最好将其设为模块而不是 class。

这是我最后做的事情:我的主文件自动加载扩展 class,然后扩展 class 自动加载基础 class。重新打开 class 会触发第二次自动加载。虽然有点笨拙,但这让我在保持自动加载行为的同时保持我的基础 classes 原始。 (自动加载对我来说是一项要求,因为 Sequel ORM 无法在应用程序首次启动时发现 table 模式。)

看起来像这样:

main.rb:

autoload :User, 'extended_models/user.rb'

extended_models/user.rb:

autoload :User, '../models/user.rb'

class User
  def self.from_omniauth(authhash)
    # ...
  end
end

models/user.rb:

class User < Sequel::Model
  # ...
end

我有一些辅助函数可以帮助我自动加载模型目录和具有相对路径的单个模型,但这是一般的想法。