Rails4.1:Active Record Basics
来源:互联网 发布:韩服lol账号购买淘宝 编辑:程序博客网 时间:2024/04/30 07:35
原文:http://guides.rubyonrails.org/active_record_basics.html
此篇主要介绍Active Record。
从中你可以了解到:
- 什么是关系对象映射以及如何在Rails中使用它们。
- Active Record在MVC架构中承担什么角色?
- 如何使用ActiveRecord模型操作存储在关系数据库中的数据。
- Active Record模式表中命名转换。
- 了解数据库的迁移、验证以及回调
1 什么是Active Record?
Active Record是MVC架构中的M部分,是负责业务数据及其逻辑的系统层。Active Record能够便捷的创建和使用存储在数据库中持久业务数据对象。Active Record本质上是对象关系模型映射系统。
1.1 Active Record模式
Martin Fowler在他的Patternsof Enterprise Application Architecture书中介绍了Active Record。在ActiveRecord中,对象是拥有持久数据以及操作数据行为的。Active Record认为对数据的操作逻辑应该是数据对象的一部分,用户在读写对象过程中执行操作逻辑。
1.2 对象关系映射
对象关系映射,通常简称为ORM,是连接应用的富对象与关系型数据库系统之间的一项技术。通过使用ORM,可以在不使用SQL语句或使用少量的数据访问代码的情况下,方便的获取对象的属性和关系。
1.3 Active Record的对象关系映射框架
Active Record给了我们一些机制,最重要的如下:
- l 表现型模型与数据
- l 在这些模型间的表现型关联关系
- l 通过关系模型的表现继承关系层级
- l 在获取持久数据之前的验证模型
- l 面向对象的数据库操作
2 Active Record中的约定配置
若使用其他语言或框架来创建应用,可能必须写许多的配置代码。这个现象在ORM框架中是普遍现象。然而,若你使用Rails框架,在创建Active Record对象的时候你将只需要写极少的配置信息(甚至一些情况下根本不需要配置信息)。此种情况是若你创建的应用使用同样的配置,那么这些配置应设成为约定配置,不需要再次配置。因此,你只需要在标准约定配置无法满足的情况下才修改配置信息。
2.1 命名约定
默认情况下,ActiveRecord使用一些命名约定来查找到模型与数据表之间的映射关系。Rails将通过类名称的负数形式查找到对应的数据表。因此,对于Book类,对应的数据表将为books。Rails负数机制是非常强大的,能够获取常规单词以及非常规单词的复数/单数形式。若类名称为两个或两个以上的单词,那模型的名字需要符合Ruby约定,使用驼峰格式,但对应的数据表使用的是下划线格式即蛇形格式。例如:
- l 数据表:以下划线连接的单词的复数形式,如book_clubs
- l 模型类:驼峰式的单数形式,如BookClub
Model/Class
Table/Schema
Post
posts
LineItem
line_items
Deer
deers
Mouse
mice
Person
people
2.2 模式约定
Active Record对数据表中列名的命名约束,主要有以下几点:
- l 外键:命名应遵循singularized_table_name_id(如item_id,order_id)。这些列将用于模型之间创建关联关系的时候查询。
- l 主键:默认情况下,使用类型为整型,名称为id的列作为主键。当使用Active Record迁移功能来创建数据表时,该列将会自动创建。
也有一些可选的添加列:
- l created_at:在记录第一次创建的时候,设置当前日期和时间。
- l updated_at:当记录更新后,设置当前更新的日期和时间。
- l lock_version:为模型添加乐观锁(即对多用户可编辑的信息进行互斥操作)。
- l type:指明为单表继承
- l (association_name)_type:存储多态关联的类型
- l (table_name)_count:常用于缓存关联对象的个数。例如,对于Post类的comments_count列将存储每个Post对象对应的Comment实例个数。
注:虽然这些列名是可选的,但实际上它们已被ActiveRecord保留。除非你需要额外的功能的情况下,可以去除这些保留字。例如,type是依据单表继承原则(STI)创建数据表时的保留关键字。若你不使用STI,可以使用类似的关键字如”content”,实际上仍然可描述模型数据。
3 创建Active Record模型
创建Active Record模型的方式非常简单。你只需要创建一个继承于ActiveRecord::Base类下的子类即可:
class Product < ActiveRecord::Baseend
此例子中创建了名为Product的模型,并映射到products数据表上。通过此途径,你也可以映射该模型实例的属性列。假如products表格是通过如下SQL语句创建的:
CREATE TABLE products ( id int(11) NOT NULLauto_increment, name varchar(255), PRIMARY KEY (id));
通过以上的表模式,你可以做如下操作:
p= Product.new
p.name= “Some Book”
putsp.name # “Some Book”
4 覆盖命名转换
你是否可以遵循不同的命名约束,或将Rails应用与旧的数据库直接对接?没问题,你可以简单的覆盖掉默认的约定。
你可以使用ActiveRecord::Base.table_name=方法来声明具体的表名:
class Product < ActiveRecord::Base
self.table_name = "PRODUCT"
end
假若你如此做,那么你将必须在测试文件(fxitures/class_name.yml)中通过set_fixture_class手动定义类名:
class FunnyJoke < ActiveSupport::TestCase
set_fixture_class funny_jokes: Joke
fixtures :funny_jokes
...
end
你也可以通过ActiveRecord::Base.primary_key=覆盖默认的主键:
class Product < ActiveRecord::Base
self.primary_key = "product_id"
end
5 CRUD:读写数据
CRUD是四个单词的缩写:Create,Read,Update和Delete。ActiveRecord将自动创建方法用于应用读写数据库中数据。
5.1 创建
Active Record对象能够通过哈希、块或者创建后手动设置他们的属性。其中new方法将返回创建的新对象,而create方法将返回该对象并保存到数据库中。
例如,对于User模型,有name和occupation属性,通过调用create方法将创建一个新的对象并保存新对象到数据库中:
user = User.create(name: ‘David’,occupation: ‘Code Artist’)
使用new方法,对象能够在不保存的情况下实例化:
user = User.new
user.name = “David”
user.occupation = “Code Artist”
通过调用user.save,提交记录到数据库。
最后,如果有块参数,create和new方法都将通过块来初始化:
user = User.new do |u|
u.name = “David”
u.occupation = “Code Artist”
end
5.2 读取
Active Record为操作数据库提供了丰富的API方法。以下将列举其中的一些方法:
l # 返回所有user对象组成的集合
users = User.all
l # 返回第一个user对象
user = User.first
l # 返回第一个名为 David的对象
david = User.find_by(name: 'David')
l #返回所有名为David,职业为Code Artist,并以创建时间倒序排列的对象
你将在Active Record Query Interface章节学到更多。users = User.where(name: 'David', occupation: 'CodeArtist').order('created_at DESC')
5.3 更新
一旦Active Record对象被检索出来,它的对象将可以被修改并保存。
user = User.find_by(name: 'David')
user.name = 'Dave'
user.save
比较快捷的方式是直接通过哈希来设置属性的值:
user = User.find_by(name: ‘David’)
user.update(name: ‘Dave’)
当需要一次性更新多个属性时,这种方法时最有用的。另外,当你需要更新多个纪录的时候,你将发现update_all类方法的好处:
User.update_all“max_login_attempt = 3, must_change_password = ‘true’”
5.4 删除
通常的,一旦检索出ActiveRecord对象,那么该对象能够被从数据库中删除。
user = User.find_by(name: ‘David’)
user.destroy
6 验证
Active Record允许你在将数据存如数据库之前,对其做验证。有一些方法可用于对数据进行检查和验证,是否为空、是否唯一、是否已存在、是否为指定格式等等。
验证对于数据库的持久性是非常重要的,在create、save和update这些方法运行时进行验证:若验证返回false,将不对数据库进行任何操作。若使用了create!、save!、update!方法,验证失败后将会返回ActiveRecord::RecordInvalid异常。例如简单的例子:
class User < ActiveRecord::Base
validates :name, presence: true
end
User.create # => false
User.create! # => ActiveRecord::RecordInvalid: Validation failed:Name can't be blank
你将从ActiveRecord Validation guide中获得更多有关验证的知识。
7 回调
Active Record回调,允许你在模型生命周期内,添加特定事件。此特性,能够让你在创建记录、更新记录、删除记录等等情况下,在指定的模型中执行特定的处理逻辑。你能够在Active Record Callbacks guide章节学到更多。
8 迁移
Rails提供了专属领域语言来管理数据模式,被称为迁移。迁移将对数据库的操作存入文件中,这些文件可以通过Active Record支持的Rack程序来执行。如:
class CreatePublications < ActiveRecord::Migration
def change
create_table :publications do |t|
t.string :title
t.text :description
t.references :publication_type
t.integer :publisher_id
t.string :publisher_type
t.boolean :single_issue
t.timestamps
end
add_index :publications, :publication_type_id
end
end
Rails会追踪哪些文件已提交至数据库并提供回滚特性。可通过运行rake db:migrate和rake db:rollback命令来实际操作一下。
注意上面的代码与实际的数据库无关:可以在MySQL,PostgreSQL,Oracle以及其他数据库上运行。你能够在Active Record Migration guide章节获取更多信息。- Rails4.1:Active Record Basics
- Active Record Basics
- Active Record
- Active Record
- Active Record simple query
- Active Record Query
- ADOdb Active Record
- 关系型 Active Record
- rails active record associations
- rails active record querying
- 关系型 Active Record
- Active Record介绍
- Active Record介绍
- Active Record 初解
- Active Record Validations Helpers
- yii 数据库 Active Record
- 7.Active Record
- Active Record 活动记录
- msp430f149+外设tlv61612位DA转换模块
- 【140810】VC2008实现VC.NET麻将游戏
- hdu 1421 搬寝室 (dp)
- [ZOJ 3315] Runaway Robot [枚举]
- AJAX基础知识
- Rails4.1:Active Record Basics
- awk技巧
- PKU 3468 线段树,线段树 第 3 天
- 开博纪念:雁过留声
- spin_lock与mutex_lock
- hdu 1009 FatMouse' Trade
- 坑爹的循环题
- Apache Thrift学习小结
- LeetCode——Permutations