博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ruby缺失的define_class
阅读量:7070 次
发布时间:2019-06-28

本文共 1073 字,大约阅读时间需要 3 分钟。

hot3.png

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  endend

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

def LocalBase < ActiveRecord::Base  self.abstract_class = true  establish_connection adapter: "sqlite3", database: "local.db"enddef 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  endend

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

LocalBase:  adapter: sqlite3  database: local.dbRemoteBase:  adapter: sqlite3  database: remote.db

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

你可能感兴趣的文章
npm ERR! code EINTEGRITY 解决方法
查看>>
深受程序员鄙视的外行语录!
查看>>
使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么?
查看>>
不健康的IT狗,送给你们一句话
查看>>
进程列表中多个JAVA进程的区分识别
查看>>
IPHONE实景导航开发总结
查看>>
Git常用操作命令
查看>>
正则表达式-断言
查看>>
用git合并分支时,如何保持某些文件不被合并
查看>>
局部代码块、构造代码块、静态代码块
查看>>
聚类分析 ---- K-Means算法
查看>>
C語言最新標準-C11 「轉」
查看>>
SaltStack数据系统-Grains详解
查看>>
课程第三天内容《基础交换 三 》
查看>>
Spring(八):缓存
查看>>
全局函数指针作为模板参数
查看>>
URL access forbidden for unknown reason svn: acces
查看>>
kafka基本命令启动和测试
查看>>
你真的已经搞懂JavaScript了吗?
查看>>
Merge into 详细介绍
查看>>