Ruby缺失的define_class

Ruby默认提供了define_method等工具用于动态定义实例方法,但貌似没提供动态定义类的方法。

所谓动态定义类,不是指动态创建类,而是指类名是用字符串或符号动态给定的。看完《Ruby元编程》后,我尝试着自己实现一个:

module Kernel
  def define_class(name, ancestor = Object)
    Object.const_set(name, Class.new(ancestor))
    Object.const_get(name).class_eval(&Proc.new) if block_given?
    Object.const_get(name)      # return defined class always
  end
end

你可能会困惑,动态定义类有什么用?我遇到的一个应用场景就是用在ActiveRecord同时访问多个数据库时,需要定义多个ActiveRecord::Base的子类,如下:

def LocalBase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection adapter: "sqlite3", database: "local.db"
end

def RemoteBase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection adapter: "sqlite3", database: "remote.db"
end

可以看出里面有重复的代码,使用define_class就能规避这些重复的代码:

YAML.load(File.read("db.yaml")).each do |name, info|
  define_class(name, ActiveRecord::Base) do
    self.abstract_class = true
    establish_connection info
  end
end

同时,我把数据库连接信息移到了db.yaml文件中:

LocalBase:
  adapter: sqlite3
  database: local.db

RemoteBase:
  adapter: sqlite3
  database: remote.db

转载于:https://my.oschina.net/redraiment/blog/201647

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值