rails中的多态关联功能,很好很强大。
但是多态关联的方法名却不够人性化,下面用代码来说话。
class Brand < ActiveRecord::Base
has_many :evaluations,:as => :evaluation
end
class Page < ActiveRecord::Base
has_many :evaluations,:as => :evaluation
end
class Evaluation < ActiveRecord::Base
belongs_to :evaluation,:polymorphic => true
end
上面就是一个多态关联的经典代码,就不多说了。按代码的写法,当要在Evaluation中取Brand或者Page的值是,只能如此调用:
evaluation.evaluation #Brand or Page
对于 evaluation.evaluation 这样的代码,你会不会感到有那么一点点的恶心呢?
假如可以这样:
evaluation.brand # Brand
evaluation.page # Page
想必会更加的赏心悦目吧。
利用ruby的open class 和 method_missing 的特性,可以用下面的代码让代码更加美丽:
module ActiveRecord
class Base
def method_missing(name,*args)
# 这个方法,可以自动对多态关联生成相关的名字(类名)
resource = self.class.to_s.downcase
if (self.respond_to? "#{resource}") && (self.send "#{resource}").class.to_s.downcase.eql?(name.to_s)
self.send "#{resource}"
elsif (self.respond_to? "#{resource}=") && (self.send "#{resource}").class.to_s.downcase.eql?(name.to_s.sub('=',''))
self.send "#{resource}",*args
end
end
end
你的 model 不用做任何的改动。
有时候美丽就是如此简单。
分享到:
- 2008-12-02 22:55
- 浏览 2443
- 评论(6)
- 论坛回复 / 浏览 (6 / 2793)
- 查看更多
相关推荐
Rails中的关联不仅仅定义了模型之间的关系,还提供了很多便利的方法,如`build`, `create`, `destroy`, `find_by`, `where`等,使得在处理关联对象时更加高效和简洁。例如,`user.posts.create(title: "New Post")` ...
7. **哈希与符号化键(Hashes and Symbolized Keys)**:在Rails中,使用符号作为哈希键可以提高性能,因为符号是不可变的,且在内存中只存储一次。 8. **部分视图(Partials)**:部分视图是可重用的视图代码块,...
- **Rails中I18n的工作原理**:解释Rails中的国际化机制。 - **Rails应用的国际化设置**:指导如何配置应用的国际化设置。 - **国际化和本地化**:区分国际化和本地化的概念。 - **I18n API功能概述**:概述I18n API...
例如,要在Rails应用中创建一个新的资源,如博客文章,你需要在models目录下创建一个名为`post.rb`的文件,定义Post类,并设置属性如标题和内容。在controllers目录下创建`posts_controller.rb`,定义控制器方法,如...
标题 "在Rails中使用RSpec生产CHM文档" 暗示了这个话题是关于如何在Ruby on Rails(简称Rails)框架中使用RSpec测试工具来创建帮助文档,特别是以CHM(Microsoft Compiled HTML Help)格式。CHM文件是一种常见的...
Rails指南中文版是针对Ruby on Rails框架的一份详尽教程,旨在帮助开发者深入理解并熟练掌握这个强大的Web应用开发...通过深入学习和实践,你将成为一名高效的Rails开发者,能够创建出优雅、高效且易于维护的Web应用。
4. **ActiveRecord**:这是Rails中的ORM(对象关系映射)库,它允许开发者用Ruby代码操作数据库,无需编写SQL。 5. **Scaffolding**:Rails的快速开发工具,能自动生成CRUD(创建、读取、更新、删除)操作的模型、...
- 如何在Rails中实现RESTful接口。 - **案例分析**: - 分析一个典型的RESTful应用示例。 #### 九、练习作业2-在Group里面发表文章-双层RESTFul - **目标**: - 在Group中添加Post功能。 - **实现过程**: - 创建...
在这个项目中,`User`和`Image`模型可能会与数据库中的相应表关联,通过定义属性和关系,如`has_many :images`表示一个用户可以拥有多个图片。 5. **路由配置**: Rails的路由系统将URL映射到控制器的行动上,如`/...
此外,书中还介绍了一些Rails中的高级概念,如Strong Parameters(强参数),它在Rails 4.0版本中引入,用于解决之前版本中的参数篡改问题,从而帮助开发者安全地处理外部提交的数据。 通过一系列的教学内容,包括...
Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...
在Rails中,这通常是通过`<%= f.date_field :date_field_name %>`这样的辅助方法实现的,这里的`:date_field_name`是模型中的属性名。然后,我们可以使用WebCalendar.js为这个输入字段添加日期选择功能。在...
在Rails中,可以使用ActiveRecord来操作数据库。创建购物车模型(Cart)和商品模型(Product),定义它们之间的关系,如多对多关系,通过一个关联表记录每个购物车包含的商品及其数量。使用`has_and_belongs_to_many...
7. **activerecord-2.1.0.gem**:ActiveRecord是Rails中的ORM(对象关系映射)库,负责将数据库表映射为Ruby类,使得开发者可以通过面向对象的方式来操作数据库,而无需编写SQL语句。 这个本地安装包特别适合网络...
在Rails中,最常用的分页库是`Kaminari`和`WillPaginate`。这里我们将以`Kaminari`为例进行讲解,因为它是近年来更受欢迎的选择,且具有简洁的API和良好的社区支持。 1. **安装Kaminari** 在Gemfile中添加`...
总的来说,了解Mongrel对于理解Rails的历史和早期的部署实践非常重要,但现代开发环境中,选择更加活跃和优化的服务器软件更为常见。对于初学者来说,掌握如何安装和配置这些服务器,以及理解它们的工作原理,是提升...
在Rails中,数据库查询主要通过ActiveRecord来实现,这是一个强大的ORM(对象关系映射)工具,能够将数据库表与Ruby类关联,简化数据操作。 描述中虽然没有具体信息,但我们可以推测这可能是一篇关于Rails中查询...
- **步骤**:通过命令行使用`rails new project_name`来初始化一个新的Rails项目。 - **结构**:新项目将包含默认的目录结构,如`app`、`config`、`db`等,分别用于存放应用程序代码、配置文件、数据库迁移脚本等。 ...
ActionController和ActionView分别是Rails中处理控制器和视图逻辑的组件。Rails 2.0在这两方面也进行了相应的优化。 ##### 3.1 资产服务器 - **资产服务器支持**:为了更好地管理静态资源,如图片、CSS和JavaScript...
本书《Component-Based Rails Applications》主要介绍了如何使用Rails引擎(Rails Engine)进行基于组件的Rails应用开发,以及如何对应用程序的大型模块进行拆分和模块化。以下是书中一些核心知识点的详细说明: 1....