在rails里面,我们可以用很方便的声明方式来定义model之间的关联关系,例如:
class Topic < ActiveRecord::Base
has_many :posts
belongs_to :user
end
那has_many和belongs_to究竟是什么东西呢?其实他们是Topic类的class method,标准写法是:
class Topic < ActiveRecord::Base
Topic.has_many(:posts)
Topic.belongs_to(:user)
end
那么has_many可以给我们带来什么呢?类方法has_many在被执行的时候,给Topic的对象实例添加了一系列方法:posts, posts<<, orders.push......等等。所以当我们在model里面声明has_many,belongs_to等对象关系的时候,一系列相关的对象方法就被自动添加进来了。
既然明白了rails的小把戏,让我们来自己试试看吧:
module M
def self.included(c)
c.extend(G)
end
module G
def generate_method(*args)
args.each do |method_name|
define_method(method_name) { puts method_name }
end
end
end
end
class C
include M
generate_method :method1, :method2
end
c = C.new
c.method1
c.method2
我们定义了一个声明generate_method,可以接受多个symbol,来动态的创建同名的方法。现在我们在类C里面使用这个声明:generate_method :method1, :method2,当然我们需要include模块M。为什么rails的model不需要include相关的模块呢?当然是因为Topic的父类ActiveRecord::Base已经include了模块Associations了。
类C通过include模块M,调用了模块M的一个included回调接口,让类C去extend模块G,换句话来说就是,通过include模块M,来给类C动态添加一个类方法generate_method。
这个generate_method被定义在模块G当中,它接受一系列参数,来动态创建相关的方法。于是我们就实现了这样的DSL功能:
通过在类C里面声明generate_method :method1, :method2,让类C动态的添加了两个实例方法method1,method2,是不是很有意思?
实际上rails的对象关联声明也是以同样的方式实现的。
分享到:
- 2007-05-05 21:59
- 浏览 10505
- 评论(7)
- 论坛回复 / 浏览 (7 / 10932)
- 查看更多
相关推荐
《Programming Ruby》是一本关于Ruby编程语言的经典著作,由Dave Thomas、Andy Hunt和Chad Fowler合著。...通过深入阅读和实践,你将能够熟练地运用Ruby进行各种开发工作,并领略到Ruby优雅而强大的编程哲学。
Ruby编程语言是由Yukihiro Matsumoto(又称为Matz)创建的一种面向对象的语言,它以其简洁、优雅的语法和强大的功能而...通过深入阅读和实践,你将能够领略到Ruby语言的魅力,并具备使用Ruby进行实际项目开发的能力。
Ruby是一种面向对象的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。这本书籍集合包含了两本关于Ruby的实用书籍——...通过阅读和实践书中的例子,你将能更好地领略到Ruby的魅力,提升自己的编程技能。
Ruby以其简洁、优雅的语法和强大的元编程能力著称,是许多开发者首选的脚本语言。本书将带你走进Ruby的世界,探索其核心概念和常用库,助你在实践中提升编程技能。 Ruby语言的基础部分包括变量、常量、数据类型(如...
Ruby是一种面向对象的、动态...通过深入学习Ruby语言和Rails框架,初学者不仅可以提升编程技能,还能领略到敏捷开发的魅力。本教程的PDF文档《rubyonrails.pdf》将详细讲解这些概念和实践,是初学者入门的理想资源。
Ruby是一种面向对象的、动态类型的编程语言,由日本的松本行弘(Yukihiro Matsumoto)创立,因...通过学习,不仅可以了解Ruby的基本语法,还能领略到其设计理念,为后续的Web开发、自动化脚本编写等应用打下坚实的基础。
- **简介**:本书以一种轻松愉快的方式介绍了Ruby语言的各种特性,作者David Black以其丰富的经验带领读者领略Ruby的魅力。 - **适合人群**:适合希望通过实践快速掌握Ruby语言特性的学习者。 #### 二、Ruby 学习...
Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。本初级教程旨在为初学者提供一个易懂且全面的Ruby学习路径,让大家能够快速掌握这门语言的基础知识。 一、Ruby简介 ...
通过阅读《Addison-Wesley.The.Ruby.Way.2nd.Edition.Oct.2006.chm》这本书,开发者不仅能掌握Ruby语言的基本语法,还能领略到Ruby的灵活性和创造性,从而更好地利用Ruby解决实际问题。这本书是Ruby初学者和进阶者的...
Ruby由日本人松本行弘(Yukihiro Matsumoto)在1990年代创建,设计目标是结合Smalltalk的面向对象特性、Perl的文本处理能力和Lisp的函数式编程。Ruby的最大特点是其纯面向对象,意味着所有数据,包括基本类型如整数...
1. 面向对象:Ruby的万物皆对象,就连基本的数据类型如整数、字符串和布尔值都是对象,具有方法调用的能力。 2. 动态类型:无需预先声明变量类型,Ruby会自动根据赋值确定变量类型。 3. 自动内存管理:Ruby采用垃圾...
总的来说,《Raven:使用Ruby脚本构建Java项目》是针对Java开发者的一份宝贵资源,它将帮助你提升构建自动化水平,使开发流程更加高效,同时也能让你领略到Ruby语言的魅力。通过学习和应用书中的知识,你将能够利用...
通过阅读和分析这些源代码,你可以更深入地理解Rails的工作原理,提升实际开发技能,并领略Ruby on Rails的魅力。在学习过程中,不断实践和调试代码,将理论知识与实际应用相结合,是掌握这门技术的关键。
Ruby on Rails,简称Rails,是由David Heinemeier Hansson基于Ruby语言开发的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在简化Web应用开发过程,提高开发效率。这个中文版的《Ruby ...
通过学习和实践"kotlin-dsl-gradle-sample"项目,开发者不仅能掌握Kotlin DSL的基本用法,还能领略到其在提升构建脚本质量方面的巨大潜力。在实际开发中,运用Kotlin DSL可以显著提高工作效率,减少维护成本,让构建...
本教程将带你一步步走进Ruby的世界,领略其魅力。 在Ruby中,一切都是对象,包括基本的数据类型如整数、字符串和布尔值。这种设计使得编程更加灵活,可以方便地进行面向对象编程。Ruby提供了丰富的内置类和方法,...
Ruby on Rails,简称Rails,是基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,强调“约定优于配置”和DRY(Don't Repeat Yourself)原则,旨在提高开发效率和代码可读性。...
通过这个项目,我们可以领略到编程艺术的魅力,递归不仅仅是一个抽象的算法概念,它也可以转化为可视化的艺术作品。同时,这也是一次将理论知识应用于实践的好机会,无论是对Ruby语言的学习,还是对递归算法的理解,...
Sinatra是一个基于DSL(领域特定语言)的Web框架,它的设计灵感来源于DHH的Ruby on Rails。Sinatra通过简单的路由规则来处理HTTP请求,比如`get '/' do`用于定义处理GET请求的代码块。此外,Sinatra支持模板引擎,...
《Ruby课程概述》 ...通过RubyCourse的学习,你可以掌握编写高效、可维护的Ruby代码的技巧,同时也能领略到动态语言的魅力和灵活性。对于想要进入Web开发或者对元编程感兴趣的开发者来说,这是一个极好的起点。