
Active Record
文章平均质量分 66
jbf034a
这个作者很懒,什么都没留下…
展开
-
14.1 表与类
当你创建一个ActiveRecord::Base 的子类时,实际上是包装一个数据库表。缺省情况下,Active Record 假定表名字是类名字的复数形式。如果类名包含多个以大写字母开头的单词,表名会假定以下划线分隔这些单词。一些无规律的复数形式也会被处理。这些规则反应了DHH(rails 的作者)的理念:类名字应该是单数,而表名字应该是复数。如果你不喜欢这种做法,你可以在配置文件...2008-07-24 16:30:44 · 123 阅读 · 0 评论 -
计数器
has_many 关系定义了一个属性,它是一个集合。它似乎能够回答有关集合大小的问题:这个定单有多少个商品项目呢?实际上你会发现,聚合有个size()方法,它返回的就是这个关联的对象数目。这个方法是深入到数据库在子表中执行select count(*)语句,计算外键引用父表的相关记录数。这个看起来是可行的。然而,如果你需要频繁的知道子项目的个数,这个额外的SQL 就可能会是一个...原创 2008-07-29 13:51:56 · 108 阅读 · 0 评论 -
自连接
对于表中的一个记录连接同一个表中的另一个记录也是可能发生的。举个例子,公司里每一个雇员有一个manager 和一个mentor,这两个也是雇员。在Rails 你可以这样建模。class Employee < ActiveRecord::Basebelongs_to :manager,:class_name => "Employee",:foreign_key => "manag...原创 2008-07-29 13:51:08 · 115 阅读 · 0 评论 -
多对多关系
多对多的关系是对称的关系,两个连接的表都互相使用has_and_belongs_to_many来声明它们之间的关系。在数据库中,多对多关联是使用中间连接表来实现的。它包含一对外键连接两个目标表。Active Record假定这个连接表的名字是两个目标表名以字母顺序串联起来。在前面例子中,我们连接表categories和表products, Active Record会去找一个名...原创 2008-07-27 15:38:32 · 325 阅读 · 0 评论 -
一对多关系
一对多关系允许你描述一个对象集合。例如,一个定单可能有多个关联的商品项目。在数据库中,对于一特定定单的所有商品项目行包含一个外键列来引用这个定单。在Active Record中,父对象(逻辑上是包含子对象的一个集合)使用has_many来声明对子表的关系,子表用belongs_to来表明它的父类。在我们的例子中,类LineItem belongs_to:order和orders表h...原创 2008-07-27 15:27:19 · 180 阅读 · 0 评论 -
一对一关系
一对一关系(或者更正确的是,一对零或一关系)由一个表内的行中的一个外键实现,它至少引用了另一个表的单个行。上面图显示了order和invoice之间的一对一关系:一个order可以没有invoice引用它或者只有一个invoice引用它。在Active Record内,我们通过添加声明has_one :invoice给类Order来表示这种关系 ,同时,添加belongs_to :orde...原创 2008-07-27 15:04:52 · 290 阅读 · 0 评论 -
表之间的关系
大多数应用程序都是使用数据库的多个表的,而且一些表之间还存在着一些关联。定单Orders有多个商品项目。一个商品项目将引用一个特殊的产品。一个产品可能属于许多不同的产品分类目录,而每个分类目录有许多不同的产品。数据库schema中,这些关系是由基于主键的值来表达的。[关联的另一种风格是,model对象与它的另一个子类的model之间的关系。在253页的15.3节讨论。]如果一个商品...原创 2008-07-27 14:52:49 · 177 阅读 · 0 评论 -
CRUD-delete
Active Record 支持两种形式的记录删除。(delete)首先,它有两个类级别方法delete()和delete_all(),都是在数据库级别上来操作。delete()方法接受一个id 或一个id 数组,来删除表中相应的记录。delete_all()删除匹配给定条件的记录行(如果没有条件就删除全部的记录)。这两个调用的返回值依赖于适配器,一般情况典型地是受影响的记录行...原创 2008-07-27 00:19:33 · 91 阅读 · 0 评论 -
CRUD-update
我们已经讨论了很多finder 相关的方法,Active Record 关于更新记录的操作并不多。如果你有一个Active Record 对象(或许表示为我们的orders 表的一行),你可以通过save()方法把它写入数据库,如果这个对象以前是从数据库中读出,这个存盘的操作将更新现有记录。否则save()将会插入一个新行。如果一个现有记录行被更新,Active Record 将使用它的主...原创 2008-07-27 00:13:24 · 172 阅读 · 0 评论 -
CRUD—Read
从数据库中读取数据首先就要涉及到确定你所关心的特定的数据行--你必须给ActiveRecord 一些条件值,它将返回包含匹配数据行的对象。查找表中的一行记录最简单的方法是指定它的主键。每个model 类都支持find()方法,它接受一个或多个主键的值作为参数。如果只是给定一个主键,它返回一个对象,该对象包含对应记录行的数据(或者是抛出RecordNotFound 异常)。如果给定了...原创 2008-07-24 17:12:55 · 121 阅读 · 0 评论 -
CRUD—Create
在对象-关系的范式中,表被表现为类,并且表内的行被对应于那个类的对象。因此我们通过创建相应类的对象来创建表中的行,是顺理成章的事。1、我们可以通过调用Order.new()来创建一个对象,表示orders 表中的行。然后我们可以填充各种属性的值(对应表的各个列)。最后,我们调用对象的save()方法存储回order 到数据库中。没有这个方法调用的话,order只会存在于本机的内...原创 2008-07-24 16:54:29 · 101 阅读 · 0 评论 -
连接数据库
连接数据库 Active Record 把数据库连接的概念抽象出来,有助于程序处理各种特殊数据库的底层 细节。相反,Active Record 应用程序使用通常的调用,代理了一组数据库适配器的细节。 (This abstraction breaks down slightly when code starts to make SQL-based queries, as we&rsq...2008-07-24 16:39:13 · 109 阅读 · 0 评论 -
主键与ID
你可能已经注意到了我们的例子数据库内的所有表都定义有一个整数列叫id,做为表的主键。这是Active Record 的约定。“请等等!”你喊道。“我的order 表的主键应该是定单号或一些意义的列?为什么使用一个没有意义的主键,比如id?”原因是实践—外部数据的格式可能随着时间而更改。例如,你可能想一本书的ISBN 应该是books 表的最好主键。毕竟,ISBN 是唯一的。但是...2008-07-24 16:34:20 · 457 阅读 · 0 评论 -
Storing Structured Data(序列化数据)
有时候这样做很方便,存储包含任意Ruby 对象的属性直接到数据库的表中。ActiveRecord 通过序列化Ruby 对象到一个字符串中(使用YAML 格式)来支持这种方式,并且存储这个字符串到数据库内对应此属性的列中。在schema 中,这个列必须被定义为text 类型。因为Active Record 通常将映射一个character 或text 列为一个纯Ruby 字符串,在你...原创 2008-07-24 16:33:44 · 150 阅读 · 0 评论 -
Boolean 属性
有些数据库支持boolean 列类型,而有些不支持。这使得Active Record 很难抽象化boolean。例如,如果基础数据库没有boolean 类型,一些开发者使用char(1)列包含”t”或”f”来表示true 或false。而其它开发者使用整数列,0 是false,1 是true。即使数据库直接支持boolean 类型(如MySQL 和它的bool 列类型),它们也只是...2008-07-24 16:32:43 · 575 阅读 · 0 评论 -
列与属性
Active Record 对象对应数据库表中的行。对象的属性对应表中的列。你可能已经注意到我们定义的Order 类并没有提到orders 表中任何列。这是因为Active Record 是在运行期间动态决定它们。Active Record 在数据库端的schema 上反射,以配置包装表的类。[这不是严格的事实,就像一个model 可以有不是schema 的一部分的属性。我们在272 ...2008-07-24 16:32:04 · 218 阅读 · 0 评论 -
事务处理
数据库事务将一系列修改组合在一起,以一种方式要么完成所有修改,要么一个都不修改。经典使用事实的例子是两个银行账户间的现金交易。基本逻辑很简单。account1.deposit(100)account2.withdraw(100)在Active Record 中,我们使用transaction()方法来执行一个块,这是一个特殊的数据库事务处理的上下关联的段落。这个块的结尾,事务处...原创 2008-07-29 13:53:53 · 120 阅读 · 0 评论