文档章节

Active Record Basic

ChingHwang
 ChingHwang
发布于 2014/05/22 10:30
字数 1386
阅读 41
收藏 0

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

© 著作权归作者所有

ChingHwang
粉丝 0
博文 10
码字总数 11194
作品 0
海淀
私信 提问
Rails 5.0.0.beta2 等多个版本发布

Rails 5.0.0.beta1.1, 4.2.5.1, 4.1.14.1, 3.2.22.1, and rails-html-sanitizer 1.0.3 发布,有重要安全修复,请尽快更新: CVE-2015-7576 Timing attack vulnerability in basic authentic......

oschina
2016/01/26
1K
7
Rails 4.2.4 和 Rails 4.1.13 发布

Rails 4.2.4 和 Rails 4.1.13 正式版发布,此前的 RC 版本并没有回退问题,改进内容跟 RC 版本是一样的。 4.1.12 Action Mailer CHANGELOG Action Pack CHANGELOG Action View CHANGELOG Act...

oschina
2015/08/25
898
0
Rails 4.2.5.rc2/4.1.14.rc2 发布

Rails 4.2.5.rc2 发布,相比 Rails 4.2.4,改进如下: Action Mailer CHANGELOG Action Pack CHANGELOG Action View CHANGELOG Active Model CHANGELOG Active Record CHANGELOG Active Supp......

oschina
2015/11/07
645
1
YII2.0 AcriveRecord的简单使用

这篇文章我们来看看在 Yii2 之中的 Active Record,为啥要将 Active Record 单独出来说呢?因为个人认为这是 Yii(不管是 Yii1.1 还是 Yii2)最强大的一部分功能之一,何况又遇上在 Yii2 中其...

bieru
2015/05/10
0
0
Rails 4.2.3/4.1.12 正式发布

Rails 4.2.3 和 Rails 4.1.12 正式发布,因为没有回退问题,所以跟 RC 版本的改进是一样的。 Rails 4.1.12 相比 4.1.11 的改进如下: Action Mailer CHANGELOG Action Pack CHANGELOG Action...

oschina
2015/06/27
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.1K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部