在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
MongoDB是个好东西,作为非关系数据库,十分的便利,符合Ruby的一贯精神 在使用中,出现了以下问题:
class Sample ... def self.find(hash = nil) cursor = self.collection.find(hash) cursor end def self.to_sample(ordered_hash) ... end ... end Sample 对应于一个Collection,Sample#find返回一个cursor,而我们使用的方法大致如下:
Sample.find.each |hash| sample = Sample.to_sample(hash) ... end 这是段极其Ugly的代码,每次我们从Sample#find获得的对象都要 to_sample一下才能使用,不得不考虑Ruby强大解决能力:
class Sample ... def initialize(ordered_hash) ... end #instead of : #def self.to_sample(ordered_hash) # ... #end def self.find(hash = nil) cursor = self.collection.find(hash) class << cursor alias :old_next_document :next_document def next_document hash = old_next_document Sample.new(hash) end end cursor end ... end
对于cursor实例,采用了Ruby 的 singleton class (区别于设计模式中的单例模式),动态包装了next_document方法(next_document 是 each 等其他方法的基础,是Cursor中唯一获取记录的函数),Sample.find.next_document 返回 Sample对象,一切顺利,这样看似解决了问题
但是当我们有了多个Collection类,并需要提取出一个基类时问题就来了:
假设我们的基类叫Coll,代码如下: class Coll ... def initialize(ordered_hash) ... end #instead of : #def self.to_sample(ordered_hash) # ... #end def self.find(hash = nil) cursor = self.collection.find(hash) class << cursor alias :old_next_document :next_document def next_document hash = old_next_document Coll.new(hash) end end cursor end ... end我们只是将Sample换成了Coll,而next_document中的Coll.new(hash)很显然不符合我们的要求(不能初始化成适当的子类,只能生成Coll类实例) 。比如此时我们调用Sample.find.next_document,获得的就只能是Coll类的实例(当然也很有可能出错)。问题集中在 Singleton class 的代码没有根据调用类(Sample)动态生成,当使用Ruby的时候,很显然这不可饶恕: class Coll ... def initialize(ordered_hash) ... end #instead of : #def self.to_sample(ordered_hash) # ... #end def self.find(hash = nil) cursor = self.collection.find(hash) cursor.instance_eval <<-EOT alias :old_next_document :next_document def next_document hash = old_next_document #{self}.new(hash) end EOT cursor end ... end class Sample < Coll endIt's better , ha. 我们动态生成了字符串作为执行代码,为单独的cursor实例生成了单独的next_document方法,返回特定的对象(Sample.find.each 返回 Sample对象,Blurblur.find.each 返回Blurblur对象) |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论