`
yangzhihuan
  • 浏览: 169220 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

让rails中多态关联的方法名更加人性化

阅读更多
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 不用做任何的改动。

有时候美丽就是如此简单。

分享到:
评论
6 楼 Omnibus 2008-12-30  
不理解你想作什麼。

如果你要
evaluation.brand
evaluation.page

,根本不必搞什麼特別的東東。
class Brand < ActiveRecord::Base  
  has_many :evaluations
end  
   
class Page < ActiveRecord::Base  
  has_many :evaluations
end

class Evaluation < ActiveRecord::Base  
  belongs_to :brand
  belongs_to :page
end


命名係自行選擇。官方例體並無你的問題
class Asset < ActiveRecord::Base
  belongs_to :attachable, :polymorphic => true
end

class Post < ActiveRecord::Base
  has_many :assets, :as => :attachable
end

@asset.attachable = @post

不明白Brand與Page有何關係,我就亂作一個product。你可以改一個比較近人習用之名。
class Brand < ActiveRecord::Base  
  has_many :evaluations,:as => :product
end  
  
class Page < ActiveRecord::Base  
  has_many :evaluations,:as => :product
end  
   
class Evaluation < ActiveRecord::Base  
  belongs_to :product,:polymorphic => true  
end

@evalutation.product = Page.new
@page.evaluations << Evaluation.new

polymorphic relationship係為幫助性近之類,可以用統一method插口處理。不必各自分開。
5 楼 yangzhihuan 2008-12-03  
climber2002 写道
像这种多态一般写成

 class Evaluation < ActiveRecord::Base  
   belongs_to :evaluationable,:polymorphic => true  
 end  


你不觉得这样:
evaluation.brand # Brand   
evaluation.page # Page 

更加易读,更加容易理解吗?
4 楼 yangzhihuan 2008-12-03  
艾云 写道
yy小说男又开始rb了

放纵了几日,回归了。
3 楼 climber2002 2008-12-03  
像这种多态一般写成

 class Evaluation < ActiveRecord::Base  
   belongs_to :evaluationable,:polymorphic => true  
 end  
2 楼 yangzhihuan 2008-12-03  
上面的代码其实是有问题的,刚刚发现的。
正确代码如下:
   def method_missing(name,*args)
      puts "miss method :#{name}"
      #      这个方法,可以自动对多态关联生成相关的名字(类名)
      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
      else
        super
      end
    end

请注意最后:
     else
        super
      end

如果没有这个 super 的话,rails的魔术就不灵了,因为activerecord中自动为数据库字段增加访问方法也是用 method_missing的。
1 楼 艾云 2008-12-03  
yy小说男又开始rb了

相关推荐

    关于Rails中的表关联的程序

    Rails中的关联不仅仅定义了模型之间的关系,还提供了很多便利的方法,如`build`, `create`, `destroy`, `find_by`, `where`等,使得在处理关联对象时更加高效和简洁。例如,`user.posts.create(title: "New Post")` ...

    Ruby on Rails中文指南

    7. **哈希与符号化键(Hashes and Symbolized Keys)**:在Rails中,使用符号作为哈希键可以提高性能,因为符号是不可变的,且在内存中只存储一次。 8. **部分视图(Partials)**:部分视图是可重用的视图代码块,...

    Ruby on Rails 指南 v5.0.1 中文版

    - **Rails中I18n的工作原理**:解释Rails中的国际化机制。 - **Rails应用的国际化设置**:指导如何配置应用的国际化设置。 - **国际化和本地化**:区分国际化和本地化的概念。 - **I18n API功能概述**:概述I18n API...

    使用Aptana+Rails开发Rails Web应用(中文)

    例如,要在Rails应用中创建一个新的资源,如博客文章,你需要在models目录下创建一个名为`post.rb`的文件,定义Post类,并设置属性如标题和内容。在controllers目录下创建`posts_controller.rb`,定义控制器方法,如...

    在rails中 使用RSpec生产CHM文档

    标题 "在Rails中使用RSpec生产CHM文档" 暗示了这个话题是关于如何在Ruby on Rails(简称Rails)框架中使用RSpec测试工具来创建帮助文档,特别是以CHM(Microsoft Compiled HTML Help)格式。CHM文件是一种常见的...

    rails指南 中文版

    Rails指南中文版是针对Ruby on Rails框架的一份详尽教程,旨在帮助开发者深入理解并熟练掌握这个强大的Web应用开发...通过深入学习和实践,你将成为一名高效的Rails开发者,能够创建出优雅、高效且易于维护的Web应用。

    Ruby On Rails中文教材(PDF)

    4. **ActiveRecord**:这是Rails中的ORM(对象关系映射)库,它允许开发者用Ruby代码操作数据库,无需编写SQL。 5. **Scaffolding**:Rails的快速开发工具,能自动生成CRUD(创建、读取、更新、删除)操作的模型、...

    Rails 101 入门电子书

    - 如何在Rails中实现RESTful接口。 - **案例分析**: - 分析一个典型的RESTful应用示例。 #### 九、练习作业2-在Group里面发表文章-双层RESTFul - **目标**: - 在Group中添加Post功能。 - **实现过程**: - 创建...

    Rails项目源代码

    在这个项目中,`User`和`Image`模型可能会与数据库中的相应表关联,通过定义属性和关系,如`has_many :images`表示一个用户可以拥有多个图片。 5. **路由配置**: Rails的路由系统将URL映射到控制器的行动上,如`/...

    Rails101_by_rails4.0

    此外,书中还介绍了一些Rails中的高级概念,如Strong Parameters(强参数),它在Rails 4.0版本中引入,用于解决之前版本中的参数篡改问题,从而帮助开发者安全地处理外部提交的数据。 通过一系列的教学内容,包括...

    关于rails 3.1 cucumber-rails 1.2.0

    Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...

    rails中使用javascript日期控件

    在Rails中,这通常是通过`&lt;%= f.date_field :date_field_name %&gt;`这样的辅助方法实现的,这里的`:date_field_name`是模型中的属性名。然后,我们可以使用WebCalendar.js为这个输入字段添加日期选择功能。在...

    rails敏捷开发的购物车系统

    在Rails中,可以使用ActiveRecord来操作数据库。创建购物车模型(Cart)和商品模型(Product),定义它们之间的关系,如多对多关系,通过一个关联表记录每个购物车包含的商品及其数量。使用`has_and_belongs_to_many...

    rails本地安装包完整版

    7. **activerecord-2.1.0.gem**:ActiveRecord是Rails中的ORM(对象关系映射)库,负责将数据库表映射为Ruby类,使得开发者可以通过面向对象的方式来操作数据库,而无需编写SQL语句。 这个本地安装包特别适合网络...

    关于rails学习中分页的示例

    在Rails中,最常用的分页库是`Kaminari`和`WillPaginate`。这里我们将以`Kaminari`为例进行讲解,因为它是近年来更受欢迎的选择,且具有简洁的API和良好的社区支持。 1. **安装Kaminari** 在Gemfile中添加`...

    Rails 中mongrel的安装

    总的来说,了解Mongrel对于理解Rails的历史和早期的部署实践非常重要,但现代开发环境中,选择更加活跃和优化的服务器软件更为常见。对于初学者来说,掌握如何安装和配置这些服务器,以及理解它们的工作原理,是提升...

    rails查询学习笔记

    在Rails中,数据库查询主要通过ActiveRecord来实现,这是一个强大的ORM(对象关系映射)工具,能够将数据库表与Ruby类关联,简化数据操作。 描述中虽然没有具体信息,但我们可以推测这可能是一篇关于Rails中查询...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **步骤**:通过命令行使用`rails new project_name`来初始化一个新的Rails项目。 - **结构**:新项目将包含默认的目录结构,如`app`、`config`、`db`等,分别用于存放应用程序代码、配置文件、数据库迁移脚本等。 ...

    Rails2.0资料

    ActionController和ActionView分别是Rails中处理控制器和视图逻辑的组件。Rails 2.0在这两方面也进行了相应的优化。 ##### 3.1 资产服务器 - **资产服务器支持**:为了更好地管理静态资源,如图片、CSS和JavaScript...

    component base rails applications

    本书《Component-Based Rails Applications》主要介绍了如何使用Rails引擎(Rails Engine)进行基于组件的Rails应用开发,以及如何对应用程序的大型模块进行拆分和模块化。以下是书中一些核心知识点的详细说明: 1....

Global site tag (gtag.js) - Google Analytics