【问题标题】:Chaining autoloaded classes in Ruby在 Ruby 中链接自动加载的类
【发布时间】:2015-09-04 03:30:07
【问题描述】:

我有一个类,user.rb 中的 User,它将根据以下语句的需要自动加载:

autoload :User, 'models/user.rb'

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

在 Ruby 中是否有链接自动加载的类的模式?比如:

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

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

【问题讨论】:

    标签: ruby sequel


    【解决方案1】:

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

    看起来像这样:

    ma​​in.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
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这是Sequel::Model 的集合,将它们变成模块的最佳方法是什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 2019-01-05
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      相关资源
      最近更新 更多