持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情
一、ORM 框架
ORM 全称是 Object Relation Mapping 既对象关系映射,也就是建立程序中实体类对象到关系型数据库之间的映射。
ORM 提供了概念性的、易于理解的模型化数据库的方法,ORM 并不是一个具体的框架,而是一类实现将对象持久化到数据库的框架的总称,如 Python 中的 SqlAlchemy 框架、Java 中的 Hibernate 框架等都是 ORM 框架。
ORM 关系映射映射主要分为是三个级别的映射,分别是:
- 实体类 => 表
- 实体类的一个实例化对象 => 表中的一行记录
- 实例化对象的属性与属性值 => 表中字段与字段值
在使用基于 ORM 框架完成实体对象到数据库表的映射之后,既可以利用面向对象程序设计语言的简单易用性,通过调用方法就可以实现对数据库表中的数据进行增删改查的操作。又可以利用关系型数据库的优势来实现程序中产生的数据的持久化存储。
在项目初期阶段往往会用到 UML 类图来设计项目中的实体类以及多个实体类之间的关系(一对一、一对多、多对多)
二、ActiveRecord
在 Rails 框架中,ActiveRecord 实现了 ORM 框架的对象与表中记录的映射关系,使用 ActiveRecord 提供的方法和属性可以直接以对象的形式进行数据的存取。
ActiveRecord 封装了对数据库以及数据库表的创建、查询、更新和删除等操作,而且 ActiveRecord 简化了通常使用 ORM 框架所需要的配置,使得更加容易实现对数据库的访问。
ActiveRecord 是 Rails 框架中的一个模块,安装 Rails 时会自动安装 ActiveRecord 模块,无须单独安装。
ActiveRecord 会自动把模型类和数据库表关联起来,同时为这个模型了对象提供响应的访问数据库表的方法,ActiveRecord 中对象和表映射关系如下:
- 实体类到表的映射,从 ActiveRecord 类继承的实体类抽象了一个与之对应的数据库表,当对模型类进行操作的时候,系统会自动转换为对这个表的操作。
- 实体对象到记录的映射,实体类创建的每一个实例都可以表示为数据库表中的一行记录,如果要访问这些数据,只需要通过方法实体类的属性既可。
- 对象属性到字段的映射,实体类的每一个属性都与数据库表中的一个字段对应,当使用抽象的实体类操作属性的时候,会自动转换为对响应字段的操作。
ActiveRecord 查询数据
ActiveRecord 可以指定任意的条件执行查询操作,并直接获取查询到的数据对象。
查询方法
ActiveRecord 中的 find 方法可以非常方便的以面向对象的方式查询数据,find 方法提供了多种不同的查询方式:根据主键查询、查询第一行、查询最后一行、查询所有以及查询指定行数等,find 方法可以指定查询条件、排序规则、分组查询和指定返回记录的个数等来实现列举出来的这些查询方式。
| 查询选项 | 说明 |
|---|---|
| :conditions | 表示 SQL 语句中的条件子句,传递给该选项的参数是 SQL 字符串,如 name='tom'、age=:age 等 |
| :order | 该选项用于指定结果集的排序方式,对应 SQL 中的 order by 子句 |
| :group | 指定结果集的分组方式,对应 SQL 中的 group by 子句 |
| :having | 对使用 group by 的子句在进行过滤,对应 having 子句 |
| :limit | 指定返回的记录数 |
| :offset | 指定从第几行开始返回,从 0 开始计数 |
| :joins | 指定一个默认表和一个关联数据表的连接,范湖ide都是只读记录 |
| :include | 当使用左外连接时,该选项用于加载左连接的关联条件,传递给该选项的参数是一个已经在 Model 文件中定义好的关联 |
| :select | 该选项表示查询语句要查询的字段名,默认为 “*”,表示返回所有字段,也可以显示的指定要查询的字段名称 |
| :from | 该选项用于指定查询的数据表,默认为 find 方法对应的类,也可以改写为其他的数据库表 |
| :readonly | 用于指定查询的结果是否为只读 |
| :lock | 表示一段 SQL 语句是否独占锁定建立的连接 |
根据主键查询
find 方法可以根据主键查询记录,可以接收一个或者多个主键,根据传入的主键值返回相应的结果集,如果主键不存在则会抛出 RecordNotFound 异常
修改 controllers/articles_controller.rb 中的 index 方法,通过 find 方法查询主键为 1 和 3 的记录,并在页面上进行展示
def index
# @articles = Article.all
@articles = Article.find(9, 10)
respond_to do |format|
format.html
format.xml {
render :xml => @articles
}
end
end
启动应用,浏览器访问 /articles
页面正常展示出查询到的指定主键的数据,如果查询的主键不存在则控制台和页面会报错
获取第一行或者最后一行记录
def index
# 其余代码保持不变
@articles = []
@articles << Article.last
@articles << Article.first
重启应用,访问 /articles
查询所有
ActiveRecord 可以直接通过模型类调用 all 方法来获取所有记录
def index
# 其余代码保持不变
@articles = Article.all
保存修改,浏览器访问 /articles