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 Mind Map。 总结来说,Ruby Mind Map 是一款基于 Ruby 语言的开源思维导图工具,提供丰富的自定义选项和交互操作,有助于用户高效地整理和...
Ruby-Ancestry是一个非常有用的库,它允许开发者在ActiveRecord模型中构建和管理层次结构,形成树状结构。这个库特别适用于那些需要处理有层级关系数据的场景,比如分类、菜单系统、组织架构等。Ancestry通过提供一...
在Ruby中操作Excel文件主要是通过`win32ole`库来实现的,这个库允许Ruby程序与Windows操作系统中的Office应用程序进行交互,如Microsoft Excel。以下是关于如何使用Ruby操作Excel的详细步骤和知识点: 1. **引入win...
在 Ruby 编程语言中,对文件进行操作是非常常见的需求之一,无论是简单的文件读写还是复杂的文件管理任务,都需要对 Ruby 的文件处理机制有一定的了解。本篇将详细介绍 Ruby 中如何进行文件操作,包括但不限于文件的...
"ruby中英文api"资料集可能包含了对这些内容的解释,无论是对于初学者还是有经验的开发者,都是宝贵的参考资料。 "ruby中文文档.chm"可能是Ruby的中文版官方文档,这对于中文环境下的学习者来说非常方便。它可能...
Ruby-RGL是一个强大的开源库,专门用于在Ruby编程语言中实现图形数据结构和算法。这个框架为Ruby开发者提供了一系列工具,使他们能够处理复杂的图论问题,进行网络分析,以及进行科学计算和分析。RGL全称为“Ruby ...
Map、Reduce和Select是Ruby中用于操作和处理数据的关键概念,它们在数据科学、分析和软件工程领域中扮演着重要角色。 1. **Ruby Map**: Map函数允许我们将一个操作应用到数组或集合中的每一个元素上,然后返回一个...
Ruby-Watir是一种开源自动化测试框架,专门用于在Ruby编程语言中进行Web应用程序的测试。它允许开发者通过编写Ruby代码来模拟用户与浏览器的交互,从而实现端到端的测试。这个工具的名字“Watir”是“Web ...
Ruby提供了许多工具来进行元编程,如`eval`函数可以执行字符串中的代码,`class_eval`和`instance_eval`允许在运行时修改类或对象的行为。此外,Ruby的`send`方法可以动态调用方法,`method_missing`可以捕获未定义...
本文将深入探讨如何在Ruby on Rails中集成并操作MongoDB。 首先,我们需要安装必要的库。MongoDB的Ruby驱动程序是`mongo` gem,而`mongoid`或`mongo_mapper`是两个流行的ORM(对象关系映射)工具,它们允许我们用...
在Ruby中,异常类是继承自`StandardError`的,你可以自定义异常类来处理特定类型的错误。 Ruby on Rails是Ruby最著名的Web开发框架,它遵循MVC(模型-视图-控制器)架构模式。这份文档可能也涵盖了Rails的相关内容...
Ruby-MongoidTree是一个用于Mongoid ORM的插件,它允许你在MongoDB数据库中创建和操作树形结构的数据。Mongoid Tree是基于物化路径模式实现的,这是一种在非关系型数据库中构建层级数据的方法。在此模式下,每个文档...
在Ruby中,Web开发最知名的框架是Ruby on Rails,它遵循MVC(模型-视图-控制器)架构模式,简化了Web应用的开发。Rails提供了许多约定优于配置的特性,使得开发者可以更快速地构建功能丰富的网站。 总结起来,"ruby...
在给定的场景中,"ruby操作flash窗口"主要涉及的是通过Ruby的Selenium WebDriver库来实现对Flash内容的自动化测试。Selenium WebDriver是一个强大的自动化测试工具,它允许我们控制浏览器并模拟用户行为,从而测试...
在Ruby中,一切都是对象,包括基本的数据类型如字符串、数字和布尔值。这种特性使得Ruby在处理复杂问题时具有很高的灵活性。文档中将详细讲解Ruby的基础语法,如变量声明、控制结构(条件语句、循环)、函数和方法...
用户指南通常会从基础开始介绍Ruby,包括变量、数据类型、控制结构(如if语句、循环)、函数、类与对象、模块、继承等。此外,还会涉及异常处理、文件操作、正则表达式和字符串处理等内容,这些都是Ruby编程的基础...
在Ruby中使用QTGui工具包,开发者可以利用Ruby的简洁语法和动态特性,同时享受到QT提供的强大GUI设计能力。通过qtbindings,Ruby程序员可以直接调用QT的类和方法,创建复杂的窗口应用、控件、布局和信号与槽机制,而...
在当前IT行业的发展中,处理XML和XSLT以及XPath是数据交互和文本处理的基本技能,尤其在使用Ruby语言进行Web开发,比如Ruby on Rails框架时,掌握这些技能对于处理后端数据和前端展示至关重要。本篇教程将介绍如何在...
在这个例子中,`has_closure_tree`定义了一个树状结构,并指定了排序字段`name`。之后,你可以像操作普通模型一样创建和更新节点,Closure Tree会自动维护其层次关系。 Closure Tree提供了许多有用的方法,如: 1....