`
poshboytl
  • 浏览: 5214 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

一些快要被我遗忘的rails特性.(1.单表继承)

阅读更多
有段时间没做Rails项目了, 最近准备开始一个新的Rails项目.简单的复习了一下,才发现的确有一些相对少用的特性已经有点遗忘.在此做个记录,也算加深个映像.

Rails中实现单表继承(Single-Table Inheritance)
        单表继承这个概念其实是要解决面向对象与关系数据库的一个矛盾或者说不同.在关系数据库中我们并没有继承这个概念.
        而单表集成解决这个问题的方式是,将父类和所有子类的属性的并集全部存入一张数据库表中,同时加入一个type字段(Rails默认其为type),来区别此条记录是属于哪一个子类的对象.
下面我举个简单的例子:
create_table :people do |t|
      t.string :type
      #公共属性
      t.string :name
      t.string :email
      
      #manager的属性:分红
      t.decimal :bonus, :precision => 10, :scale => 2
      
      #developer的属性: 电脑补助
      t.decimal :subsidy, :precision => 4, :scale => 2
      
      #customer属性: 地址
      t.string :address
      
      t.timestamps
end


model:

#person.rb
class Person < ActiveRecord::Base
end

#employee.rb
class Employee < Person
  belongs_to :manager, :class_name => "Employee"
end

#manager.rb
class Manager < Employee
end

#customer.rb
class Customer < Person
end


script/console
>> m = Manager.create(:name => 'Calvin', :email => 'calvin@god.com', :bonus => 100000.00, :subsidy => 200.00)

>> e = Employee.new(:name => 'Terry', :email => 'Terry@god.com',:subsidy => 200.00)
>>e.manager = m

>>c = Customer.create(:name => 'Gates', :email => 'Gates@god.com', :address => 'USA')

此时我们可以看看数据库:



然后我们可以做一些查询.

>> m = Person.find_by_name("Calvin")
=> #<Manager id: 1, type: "Manager", name: "Calvin", email: "calvin@god.com", bonus: #<BigDecimal:23c17c8,'0.1E6',4(12)>, subsidy: #<BigDecimal:23c178c,'0.2E3',4(8)>, manager_id: nil, address: nil, created_at: "2009-09-03 09:47:40", updated_at: "2009-09-03 09:47:40">

>> e = Employee.find_by_name("Terry")
=> #<Employee id: 2, type: "Employee", name: "Terry", email: "Terry@god.com", bonus: nil, subsidy: #<BigDecimal:237fc9c,'0.2E3',4(8)>, manager_id: 1, address: nil, created_at: "2009-09-03 09:55:54", updated_at: "2009-09-03 09:56:24">

>> e.manager
=> #<Manager id: 1, type: "Manager", name: "Calvin", email: "calvin@god.com", bonus: #<BigDecimal:237a418,'0.1E6',4(12)>, subsidy: #<BigDecimal:237a3dc,'0.2E3',4(8)>, manager_id: nil, address: nil, created_at: "2009-09-03 09:47:40", updated_at: "2009-09-03 09:47:40">

最后我们来看看,单表继承的利弊.

好处自不用说,我们用一张表就能存储所有子类的信息.不用为每一个子类创建常见一张表,从数据库的设计角度来讲,可以说是简洁了许多.

但是缺点也很明显每条记录都拥有所有子类的属性,冗余显得比较大.

按DHH的话来说, 这没有一个标准的选择, 只是一种取舍. 他更倾向于用单表继承而已.

关于单表继承更详细的一些阐述也可以参见Martin Fowler的<<企业应用架构模式>>












  • 大小: 28.9 KB
分享到:
评论

相关推荐

    Rails.Angular.Postgres.and.Bootstrap.2nd.Edition

    Chapter 1. Set Up the Environment Chapter 2. Create a Great-Looking Login with Bootstrap and Devise Chapter 3. Secure the User Database with Postgres Constraints Chapter 4. Perform Fast Queries with ...

    VIM的Rails编辑插件rails.vim.zip

    rails.vim提供了常用的一些命令,可以帮助开发,例如:Rgenerate, Rake, Rfind,RTview等,很方便,也很实用。 安装方法: 拷贝 autoload/rails.vim, plugin/rails.vim, 和 doc/rails.txt 到 ~/.vim 目录. ...

    Ruby-on-Rails-rails.zip

    Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zipRuby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zipRuby_on_...

    Pragmatic.Rails.Recipes.Rails.3.Edition.Mar.2012.pdf

    - **全面覆盖 Rails 3**:Rails Recipes Rails 3 版本全面覆盖了 Rails 3 的新特性和改进之处,确保读者能够跟上框架的发展趋势。 - **实践导向**:本书采用实际案例和解决方案的形式,帮助读者快速解决问题,并且...

    03-2 . 安装不同版本的Rails与产生Rails 5.x版专案

    [Ruby_on_Rails][中文][Rails_5.x]__03-2_._安裝不同版本的Rails與產生Rails_5.x版

    rails操作.docx

    总的来说,Rails以其高效、优雅的特性改变了Web开发的面貌。通过简单的配置和强大的自动化工具,Rails使得开发者能够快速构建复杂的Web应用,同时保持代码的整洁和可维护性。无论你是初学者还是经验丰富的开发者,...

    Wiley.Ruby.on.Rails.Bible.Oct.2008

    根据提供的文件信息,“Wiley.Ruby.on.Rails.Bible.Oct.2008”这本书主要涉及Ruby on Rails的相关知识和技术。以下是对该书标题、描述以及部分内容中的关键知识点进行的详细解读: ### 标题:“Wiley.Ruby.on.Rails...

    Rails.Recipes.Rails.3rd和源码

    《Rails Recipes》是针对Ruby on Rails框架的一本实用指南,主要涵盖了Rails 3版本的相关内容。这本书通过一系列的“配方”(recipes),为开发者提供了在实际开发中可能会遇到的问题及其解决方案,旨在帮助开发者...

    Ruby on Rails Bible.pdf

    根据提供的文件信息,“Ruby on Rails Bible.pdf”这本书涵盖了Ruby on Rails框架的基础知识、核心概念以及高级功能等内容。接下来,我们将从书中的章节标题入手,详细阐述各章节所涉及的重要知识点。 ### 引言 ...

    Netbeans 6.0 JRuby on Rails 演示 .swf

    Netbeans 6.0 JRuby on Rails 演示 .swf

    Addison.Wesley.RailsSpace.Building.a.Social.Networking.Website.with.Ruby.on.Rails

    ### Addison.Wesley.RailsSpace:使用Ruby on Rails构建社交网络网站 #### 一、引言 《RailsSpace:使用Ruby on Rails构建社交网络网站》是一本由Michael Hartl和Aurelius Prochazka共同撰写的书籍。本书旨在通过...

    使用RSpec 测试Rails 程序.pdf

    1. **Gemfile配置**:在Rails项目的`Gemfile`中添加`gem 'rspec-rails'`。 2. **测试数据库配置**:确保`.env`或`database.yml`文件中包含用于测试的数据库配置。 3. **RSpec配置**:编辑`spec_helper.rb`来配置...

    twitter-bootstrap-rails, 用于 Rails 5 4.x 资产管道的Twitter Bootstrap.zip

    twitter-bootstrap-rails, 用于 Rails 5 4.x 资产管道的Twitter Bootstrap 用于 Rails 5和 Rails 4资产管道的 Twitter BootstrapBootstrap 是 Twitter的工具包,旨在开发网络应用程序和站点的kickstart 。...

    Pragmatic - Agile.Web.Development.with.Rails.4.Sep.2013.pdf

    Pragmatic - Agile.Web.Development.with.Rails.4.Sep.2013.pdf

    Apress.Beginning.Rails.from.Novice.to.Professional.2007.

    1. **Ruby基础**:Rails是用Ruby语言构建的,因此理解Ruby的基础语法和特性至关重要。这包括变量、数据类型、控制结构、类和对象、模块、方法等基础知识。 2. **Rails架构**:Rails遵循MVC(模型-视图-控制器)架构...

Global site tag (gtag.js) - Google Analytics