Active Record是什么
Active Record是MVC中的M(模型),处理数据和业务逻辑。
Active Record负责创建和使用需要持久存入数据库中的数据。
Active Record实现了Active Record模式,是一种对象关系映射系统。
Active Record模式
在Active Record模式中,对象中既有持久存储的数据,也有对数据的操作。
Active Record模式把数据存储逻辑作为对象的一部分,处理对象的用户知道如何把数据写入数据库和从数据库中读出数据。
对象关系映射
对象关系映射(ORM)是一种技术手段,把程序中的对象和关系型数据库中的数据表连接起来。
使用ORM程序中对象的属性和对象之间的关系可以通过一种简单的方法从数据库获取,无需直接编写SQL语句,也不过度依赖特定的数据库种类。
Active Record用作ORM框架
Active Record提供了很多功能,其中重要的几个如下:
- 表示模型和其中的数据
- 表示模型之间的关系
- 通过相关联的模型表示集成关系
- 持久存入数据库之前,验证模型
- 以面向对象的方式处理数据库操作
Active Record中的“多约定少配置”原则
命名约定
Active Record使用一些命名约定来查找模型和数据表之间的映射关系。
Rails把模型的类名转换为复数,然后查找对应的数据表
如果类名由多个单词组成,按Ruby的约定,使用驼峰式命名法,对应的数据表名为下划线分割各单词
模型/类 | 数据表/模式 |
Post | posts |
LineItem | line_items |
Deer | deers |
Person | people |
模式约定
根据字段作用的不同,Active Record对数据表中的字段命名也做了相应的约定
- 外键 --使用singularized_table_name_id形式命名,例如item_id,order_id。创建模型关联后,Active Record会查找这个字段
- 主键 --默认情况下,会使用整数字段id作为表的主键。使用Active Record迁移创建数据表时会主动创建这个字段。
可选字段
-- created_at - 创建纪录时,自动设为当前的时间戳
-- updated_at - 更新纪录时,自动设为当前的时间戳
-- lock_version -在模型中添加乐观锁定功能
-- type - 让模型使用单表继承
--(association_name)_type - 多态关联的类型
--(table_name)_count -缓存关联对象的数量
创建Active Reocrd模型
创建Active Reocrd模型的过程很简单,只要继承AtiveRecord::Base类即可:
class Product < ActiveRecord::Base
end
上述代码会创建Product模型,对应数据库中products表。同时,products表中的字段也会映射到Product模型实例的属性上。
假设products表由下面SQL语句创建
CREATE TABLE products (
id int(11) NOT NULL auto_increment,
name varchar(255),
PRIMARY KEY (id)
);
按照这样的数据表结构,可以编写下面的代码:
p = Product.new
p.name = "some book"
puts p.name
不用默认的命名约定
使用ActiveRecord::Base.table_name = 方法可以指定数据表的名字
class Product < ActiveRecord:Base
self.table_name = "PRODUCT"
end
如果这么做,还要在测试中调用set_fixture_class方法,手动指定固件(class_name.yml)的类名
还可使用ActiveRecord::Base.primary_key = 方法指定数据表的主键
class Product < ActiveRecord::Base
self.primary_key = "product_id"
end
CRUD:读写数据
C表示创建,R表示读取,U表示更新,D表示删除
创建
Active Record对象可以使用Hash创建,在块中创建,或者在创建后手动设置属性。
new方法创建一个新对象
create方法创建一个新对象,并且将其存入数据库
如果在create和new方法中使用块,会把新创建的对象拉入块中:
user = User.new do |u|
u.name = "JeekWong"
u.occupation = "Code Artist"
end
读取
Active Record为读取数据库中的数据提供了丰富的API
#return a collection with all users
users = User.all
#return the first user
user = User.first
#return the first user named "jing"
jing = User.find_by(name: 'jing')
#find all users named jing who are Code Artists and sort by created_at
user = User.where(name: 'jing', occupation: 'Code Artist').order('created_at DESC')
更新
得到Active Record对象后,可以修改其属性,然后存入数据库
user = User.find_by(name: 'jing')
user.name = 'ching'
user.save
还有个简写的方式,使用Hash,指定属性名和属性值
user = User.find_by(name: 'jing')
user.update(name: 'ching')
批量更新多个记录使用类方法update_all
删除
使用destroy方法将数据从数据库中删除
user = User.find_by(name: 'jing')
user.destroy
数据验证
在存入数据库之前,Active Record还可以验证模型,把数据存入数据库之前进行验证时很重要的步骤,所以调用create,save和update方法时会做数据验证,验证失败返回false,
此时不会对数据库进行任何的修改。这3个方法还有对应的爆炸方法(create!,save!,update!),爆炸方法要严格一些,如果验证失败,会抛出ActiveRecord::RecordInvalid异常.
回调
Active Record回调可以在模型声明周期的特定事件上绑定代码,相应的事件发生时,执行这些代码
迁移
Rails提供了一个DSL用来处理数据库模式,叫做“迁移”。迁移的代码存储在特定的文件中,通过rake调用,可以用在Active Record支持的所有数据库上。
Rails会跟踪那些迁移已经用到数据库中,还提供了回滚功能。
创建数据表要执行 rake db:migrate
回滚操作要执行 rake db:rollback