当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

ActiveRecord学习(二)

发表于: 2010-06-20   作者:酷的飞上天空   来源:转载   浏览:
摘要: 单表继承 官方文档:http://api.rubyonrails.org/classes/ActiveRecord/Base.html 单表继承,在数据库中只有一张表,但映射了了两个以上的model。 比如:文章和相册的分类 文章有文章的分类,相册也有相册的分类。你可以建立两张表,也可以只建立一张表以一个字段值进行区分。 ActioveRecord使用的是建立一张表,用一个type字段,

单表继承

官方文档:http://api.rubyonrails.org/classes/ActiveRecord/Base.html

单表继承,在数据库中只有一张表,但映射了了两个以上的model。

比如:文章和相册的分类

文章有文章的分类,相册也有相册的分类。你可以建立两张表,也可以只建立一张表以一个字段值进行区分。

ActioveRecord使用的是建立一张表,用一个type字段,进行区分不同的model。type字段的值为model的类名

如下:

class Category < ActiveRecord::Base
  has_many :articles
  has_many :photos
end
class PhotoCategory < Category
end
class ArticleCategory < Category
end

 

    create_table :categories,:force => true do |t|
      t.column :category_name,:string
      t.column :type,:string
    end

 

关于集合的size,count,length

ac = ArticleCategory.find 1
ac.articles.length #=> select * from articles where category_id=1
ac.articles.size#=>select count(*) as count_all from articles where category_id=1
ac.articles.count#=>select count(*)  as count_all from articles where category_id=1

 

可见,如果只是取得记录的数量,就应该避免使用length方法,这个方法会把数据全部取出然后再计算数量。至于size和count效果相同,具体为什么恐怕要从源码上找答案了。

 

RecordNotFound

 

find的方法当利用id查询的时候,如果没有记录怎会抛出RecordNotFound的错误。

下面代码,应该很常见了

a = Article.find 1
if a
#something
end

 

当id为1的文章记录不存在时,真的就返回nil么?

我们当然希望是,只不过需要稍加修改。

思路是,自己添加一个find方法,对父类的find方法进行覆盖。在自己的find方法中调用父类的find方法,当抛出RecordNotFound异常时,返回一个nil值。

代码如下

module HelperModel
  def find(*args)
    begin
      return  super
    rescue ActiveRecord::RecordNotFound=>ex
      return nil
    end
  end
end

 

 然后在你需要的model中引入,如:

class Photo < ActiveRecord::Base
  extend(HelperModel)
end

 

 

这样,对find方法的调用则永远不会抛出RecordNotFound异常了,而以nil为代替返回。

ActiveRecord学习(二)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
一、数据库   1.数据表   Category:类别标签表(字段Type=1为类别,Type=2为标签)   Catego
摘要:最近几天有时间看了一下Castle,原来它的功能是如此的强大,从数据访问框架到IOC容器,再到WE
MVC架构中的Model层负责接受Controller收集的请求参数信息,一般来说去干两件事情。 将Controller从
ActiveRecord::Relation之scope 默认过滤条件:default_scope class User < ActiveRecord::Base
MVC架构中的Model层负责接受Controller收集的请求参数信息,一般来说去干两件事情。 将Controller从
原计划是在公司进行CMMI认证的过程中写学习笔记的,但是又一次被惰性战胜了,现在公司已经通过CMMI3
上篇文章中不是说内容有错,只是在学习思想上有问题。有导图但是没有思想,有总结但是没有深入浅出
上一篇「基本概念」中,我阐述了我所理解的 dot 绘图的基本知识,现在到了绝知此事要躬行的时刻。从
【shell脚本中的逻辑判断】 如果你学过C或者其他语言,相信你不会对if 陌生,在shell脚本中我们同样
在Java1.4之前的I/O系统中,提供的都是面向流的I/O系统,系统一次一个字节地处理数据,一个输入流产
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号