在Ruby

时间:2015-09-04 03:30:07

标签: ruby sequel

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

autoload :User, 'models/user.rb'

这个模型在几个不同的代码库之间共享(作为Git子模块,如果这有所不同)。在一个这样的代码库中,我需要重新打开User类并添加一些方法。至少对我来说,复杂的是,我需要将结果扩展类自动加载以代替原始类。

Ruby中是否存在链接自动加载类的模式?类似的东西:

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

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

2 个答案:

答案 0 :(得分:1)

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

看起来像这样:

<强> main.rb的:

SELECT `name` FROM `cities` WHERE 
`name` LIKE '%а'

<强> extended_models / user.rb:

autoload :User, 'extended_models/user.rb'

<强>模型/ user.rb:

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

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

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

答案 1 :(得分:0)

如果它在几个代码库之间共享,那么将它作为一个模块而不是一个类可能是最好的。