class BookChapter < ActiveRecord::Base
belongs_to :parent, :class_name => 'BookChapter', :foreign_key => 'parent_id'
has_many :children,
:class_name => 'BookChapter',
:foreign_key => 'parent_id',
:order => 'play_order'
def map(parent_mapping=nil, &block)
result = block.call self, parent_mapping
children.each do |chapter|
chapter.map result, &block
end
result
end
end
usage:
class EpubChapter
attr_accessor :title
def initialize
@children = []
end
def add_child(child)
@children << child
end
end
book_chapter = BookChapter.first
book_chapter.map do |chapter, parent|
# 这里处理父子关系,例如:
child = EpubChapter.new
child.title = chapter.title
parent.add_child child if parent
child
end
这是改进过之后的版本了,之前一个版本使用简单些,但是有接口上的双向依赖,就不贴出来了。
然后呢,还可以把这个方法抽出来,放到 module 中,这样就可以到处使用了:
module MappableTree
def map(parent_mapping=nil, &block)
result = block.call self, parent_mapping
children.each do |child|
child.map result, &block
end
result
end
end
class Nokogiri::XML::Node
include MappableTree
end
还有点味道,这个 map 方法要求实现类必须有一个 children 方法,而且这个 children 方法的返回值还必须有一个 each 方法,稍微封装一下,变成:
module MappableTree
def map(parent_mapping=nil, &block)
result = block.call self, parent_mapping
each_child do |child|
child.map result, &block
end
result
end
end
class Nokogiri::XML::Node
include MappableTree
def each_child &block
children.each &block
end
end
这样耦合就不那么紧了。
分享到:
相关推荐
ruby对excel的操作 详细描述ruby对excel的操作
Ancestry - 将ActiveRecord模型组织成一个树状结构
ruby mind v0.8 博文链接:https://sharkmao.iteye.com/blog/46951
RGL - 在Ruby中图形数据结构和算法的框架
ruby on rails对mongodb的操作ruby on rails对mongodb的操作ruby on rails对mongodb的操作ruby on rails对mongodb的操作
在工作中,他希望有一种比 Perl 强大,比 Python 更面向对象的语言。从1993年2月,他开始设计一个全新的自己的语言,1994年12月发布了第一个 alpha版本,并且将这种新语言定名为Ruby(红宝石)。 本教程内含多部中文...
Watir - 在Ruby中Web应用程序测试
ruby文件操作
Http Client - 在Ruby中提供类似libwww-perl(LWP)的功能
Ruby Data Processing Using Map, Reduce, and Select 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书
webmock, 在 ruby 中,对HTTP请求的stub和设置期望的库 WebMock 在 ruby 中对HTTP请求进行存储和设置期望的库。特性在低HTTP客户机库级别的Stubbing请求( 在更改HTTP库时不需要更改测试)设置和验证HTTP请求的期望...
Ruby,一种简单快捷的面向对象(面向对象程序设计)脚本语言,在20世纪90年代由日本人松本行弘(Yukihiro Matsumoto)开发,遵守GPL协议和Ruby License。它的灵感与特性来自于 Perl、Smalltalk、Eiffel、Ada以及 Lisp ...
Ruby是一种功能强大的面向对象的脚本语言,她可以使您方便快捷地进行面向对象编程.Ruby使文本处理和系统管理变得简单,与Perl非常相似.一句话:简单明了,扩展性强,移植性好. Ruby的几大亮点: 语法简单 垃圾回收 ...
Ruby中文文档.CHM 方便ruby or rails学习.
请说明在Ruby中的字符串常用操作方法。 6. 在Ruby中如何定义函数(Method)?请简要介绍在Ruby中的函数定义和调用方式。 7. Ruby中如何处理异常(Exception Handling)?请说明在Ruby中的异常处理机制。 8. Ruby中的...
ruby中文教程,从基础到深入的让你学习ruby
ruby中英文api 适合于初学者。 希望能给大家带来一些帮助
ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码
在ruby中用3des 算法进行加密操作