威尼斯登录首页Record模式吧数据存取逻辑作为对象的一部分,通过图书对象关联的作者对象
分类:威尼斯登录首页

众多开拓者很吸引为啥 FleaPHP 以火速开采为对象,却并未有提供 Active Record 情势。本文尝试详细阐释这么些标题。Active Record 是怎么着? Active Record 格局汉语名字为活动记录,在《集团应用构造方式》一书中定义如下: 活动记录:一个对象,它包裹数据库表或视图中的某一行,封装数据库访问,并在这里些数量上扩张了世界逻辑。 举个例证来讲,叁个书本数据表,每一条记下就是一本书籍的音讯。那么接收Active Record 时,每一本图书就是贰个 Active Record 对象实例。Active Record 因 Ruby On Rails 而盛行 Active Record 之所以今后那样烜赫一时,以致许多少人将 Active Record 和 ORM 划等号,完全都以Ruby On Rails 的原故。在 Ruby On Rails 中,Active Record 除了最宗旨的将数据记录和二个指标相互辉映外,还提供了数量间事关关系的处理。譬如: 一本图书有一个依然七个小编,所以每七个书本对象都和四个小编对象关系。反过来二个作者能够写多本书,所以二个小编对象也和七个图书对象关系。 在 RoSportage中,大家获得叁个图书对象时,自动就获取了该图书对象所对应的作者对象。更进一层,通过图书对象关系的审核人对象,我们能够取得该小编所写的具有书籍的对象实例。而那个干活儿,在 RoHaval中只须求几行代码而已,早前大家要求写上一大段代码能力达成均等的意义。 RoEnclave中,对 Active Record 情势的贯彻完全使用了 Ruby 语言的布帆无恙,简短几行代码就足以定义几个提到。并且通过复杂的 ActiveRecord:Base 对象,提供了 CRUD操作的暗中同意处理。所以利用 RoTiguan时,绝超越三成大面积的数据库操作只需求很微量的代码就足以做到,大大升高了开采功能。 但 Active Record 情势亦不是康健的,Active Record 存在非常多毛病。 * Active Record 格局需求数据表结议和指标属性一一对应,否则将难以使用 Active Record 形式; * Active Record 方式并不可见真的切合完周密向对象的应用程序。因为 Active Record 形式本质上将在求多个对象必得和四个数据表对应。但在完周到向对象的应用程序中,数据和操作数据的主意很恐怕分布在依次不一样的靶子中,这一个目的却并未和 某三个数据表完全对应,何况 Active Record 不可能很好的管理目的的接轨、聚合等面向对象朝齑暮盐的靶子间事关; * 随着稳步向 Active Record 加多业务逻辑,Active Record 对象中会混入越多的 SQL 语句,那在更头昏眼花的品类中声名远扬是一个不利因素。 假诺在 Active Record 情势中增添了对数码涉嫌的管理,那么还要小心质量难题: 假若二个 Active Record 对象有三个事关。那么我抽取叁个目的时,很只怕就相关取出了此外不菲对象。但那几个指标恐怕根本便是本次操功能不上的。其次,将对象更新到数据库时,也必要对涉及的指标开展管理,不然对关联对象的纠正就能甩掉。 即使能够用种种技术来防止这个情形,但必然供给开辟者对 RoR 的 Active Record 很纯熟才行。不然看上去非常粗大略的代码,背后则会是惊恐不已的梦般的数据库操作。 其次,尽管大家要将数据库中每本书的单价减半,那么采纳 Active Record 方式时,就亟须首先读取全体的记录并实例化为目的,然后更新目的属性,再写回数据库。总之那样会有多差的频率。 当然了,实际付出中未有人会如此做。开辟者会编写二个单身的主意,用一条 SQL 语句达成对批量数目标翻新。但也印证 Active Record 形式不切合批量管理数量,而实际世界中,批量拍卖数量的须要随地可以知道。 可是由于 RoWrangler 对开垦效用戏剧性的滋长,所以对于追求开拓成效的系列,RoENVISION是八个很科学的筛选。并且质量上的不足能够因而修正硬件还是协作其余本事花招来修正。因而在具体世界中,37signals.com 合营社的有着基于 RoMurano 开辟的利用,都收获了美好的品质表现。Active Record 与 ORM 许多人将 Active Record 与 ORM 划等号,那是错误的。

模型

一、Active Record 基础
介绍Models,数据库长久性以至Active Record格局

  1. Active Record是什么?
    Active Record 是 MVC 中的 M(模型),担当管理数量和职业逻辑。
    瞩目:这里工作逻辑在Model管理。
    Active Record负勒令立和应用须求长久存入数据库的数量。Active Record完结了Active Record方式,是一种对象关系映射系统。

1-1)Active Record模式
在Active Record情势中,对象中既有长久存储的数量,也可以有指向数据库的操作。Active Record方式吗数据存取逻辑作为对象的一有个别,管理目的的客商知道怎么着把数据写入数据库,还知道什么从数据库抽出数据。

1-2)对象关联映射
对象关联映射(ORM)Object-Relational-Mapping
是一种技术手段,吧应用中的对象和关系型数据库中的数据表连接起来。使用ORM,应用中目的的质量和对象时期的关联能够经过一种简易的章程从数据库中赢得,没有须要间接编写SQL语句,也可是分依赖特定的数据库种类。

1-3)用作ORM框架的Active Record
Active Record作用:

  • 表示模型和内部的数目
  • 意味着模型之间的关联
  • 因此相关联的模型表示世襲档案的次序布局
  • 从始至终存入数据库早先,验证模型
  • 以面向对象的格局管理数据库操作

2)Active Record中的约定大于配置原则

动用其它编制程序语言或框架开采应用时,大概必须要编写制定相当多结构代码。大比很多 ORM 框架都以那样。可是,借使根据 Rails 的约定,创设 Active Record 模型时决不做微微配置(临时以至完全不用配置)。Rails 的眼光是,即使大多数场馆下都要使用相符的方法铺排利用,那么就应有把那定为暗中同意的法子。所以,独有约定不能够满意须求时,才要特别布署。

2-1)命名约定
暗许意况下,Active Record使用部分命名约定,查找模型和多少库表之间的照射关系。Rails吧模型的类名调换为复数,然后寻觅对应的数据表。
eg:

模型类名为Book, 数据库表 books

Rails提供的单复数调换职能很有力,不以为奇和不习感觉常的调换方式都能管理。

模型类:单数,每个单词的首写字母应该大写 BookClub
数据库表: 复数,下划线分隔单词 book_clubs

图片.png

2-2)格局约定
基于字段的功效不一,Active Record对数据库表中的字段命名也做了相应的约定:

  • 外键:使用 singularized_table_name_id 格局命名,比方item_id,order_id。成立模型关联后,Active Record 会查找那个字段;

  • 主键:暗中认可情状下,Active Record使用整数字段id作为表的主键。使用Active Record迁移成立数据库表时,会自行创制那几个字段。

再有部分可选的字段,能为 Active Record 实例增添越来越多的成效:

  • created_at:创立记录时,自动设为当前的日期和时间;

  • updated_at:更新记录时,自动设为当前的日子和时间;

  • lock_version:在模型中加多乐观锁;

  • type:让模型使用单表世袭;

  • (association_name)_type:存款和储蓄多态关联的项目;

  • (table_name)_count:缓存所涉嫌对象的数目。比如说,二个 阿特icle 有八个 Comment,那么 comments_count 列存款和储蓄各篇小说现存的批评数量;

虽说这几个字段是可选的,但在 Active Record 中是被保存的。倘诺想行使相应的机能,就不要把这一个保留字段用作别的用处。比如,type 这几个保留字段是用来钦定数量库表使用单表世袭(Single Table Inheritance,STI)的。假使不用单表继承,请使用其它的称呼,譬喻“context”,那也能注解数据的职能。

3)创建Active Record模型

始建 Active Record 模型的历程很简短,只要继续 ApplicationRecord 类就能够了:

class Product < ApplicationRecord

end

那代码会创建Product模型,对应于数据库中的products表。
地点的代码会创建 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 # "Some Book"

4)覆盖命名约定

若是想接纳任何的命名约定,恐怕在Rails应用张使用即有的数据库能够呢?没难题,暗中认可的预约可以自由覆盖。

ApplicationRecord 世襲自 ActiveRecord::Base,后面一个定义了一类别有效的点子。使用 ActiveRecord::Base.table_name= 方法能够内定要运用的表名:

class Product < ApplicationRecord
  self.table_name = "my_products"
end

假使如此做,还要调用 set_fixture_class 方法,手动钦命固件(my_products.yml)的类名:

class ProductTest < ActiveSupport::TestCase
  set_fixture_class my_products: Product
  fixtures :my_products
  ...
end

还是可以够运用 ActiveRecord::Base.primary_key= 方法钦命表的主键:

class Product < ApplicationRecord
  self.primary_key = "product_id"
end

5)CRUD:读写多少

CUENVISIOND 是多种多少操作的简单的称呼:C 表示创制,奥迪Q5 代表读取,U 代表更新,D 表示删除。Active Record 自动创造了拍卖数据表中数据的办法。增加和删除改查。

5-1)create增
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)query查
Active Record 为读取数据库中的数据提供了丰盛的 API。
回去全体集结:

users=User.all

重临第三个:

user=User.first

回来第三个名叫David客户:

davidUser = User.find_by(name:'David')

寻觅所知名称为David,专门的学业为Code Artists的客户,并且依照created_at 反向排序:

users=User.find_by(name:'David', occupation:'Code Artists').order(created_at::desc)

5-3)Update更新

查找到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_attempts=3, must_change_password='true'"

5-4)Delete删除

检索到Active Record对象后还足以将其销毁,从数据库中删除。

user=User.find_by(name:'David')
user.destroy

6)数据注明

在存入数据库从前,Active Record还能证实模型。模型验证有好多情势,能够检查属性值是还是不是不为空,是或不是是独一,没有在数据库中现身过,等等。

啊数据存入数据库早前行行验证是是或不是主要的步骤,所以调用save和update方法时都会做多少印证。验证战败时重返false,那个时候不会对数据库做别的操作。那2个点子都有照料的爆炸方法(save!和update!)。爆炸方法要严苛一些,假若评释战败,就能够抛出ActiveRecord::Recordnvalid异常。

class User < ApplicationRecord
  validates :name, presence: true
end

user = User.new
user.save  # => false
user.save! # => ActiveRecord::RecordInvalid: Validation failed: Name can't be blank

只顾:验证是在写class的时候,预订了validates

7)回调
Active Record回调用于在模型生命周期的特准时间上绑定代码,相应的风云时有爆发时,实行绑定的代码。譬喻成立新记录,更新记录时,删除记录时,等等。

8)迁移
Rails提供了一个DSL(Domain-SpecialLanguage)用来拍卖数据库格局,叫作”迁移“。
瞩目:什么是数据库方式?
格局(schema)是数据库体系结构中的三个节点
对此SQL Server数据库来讲:
访谈多个具体的表,可以由4个部分构成:

服务器名+数据库名+模式名+表名

对于访问本地的数据库:

因为服务器已经再三再四上了,因而不要钦定
多少库名,通过use 数据库名 钦命了
形式名,假设不钦定的话,数据库暗中认可使用dbo模式

形式(schema) 是用于 在一个 大项目中的 各类 小项目
各样 小项指标表, 放在 各自的 格局(schema) 上边.
这么, 碰到 小项目里面. 有 相近名字的 表的话, 不会发生冲突.

比方说一个 公司的 系统.
里面分2个 子系统, 分别为 财务系统人力资源系统.
那2个 子系统, 共用一个数据库
那么 财务系统的表, 能够放在 财务的 形式(schema).
人力能源系统的表,放在 人力能源系统的形式里面。
那2个 子系统, 能够 相互拜候 对方的表
只是又不因为 表重名 的主题材料,影响对方。

搬迁的代码存款和储蓄在特定的公文中,通过 rails 命令奉行。能够用在 Active Record 援救的有所数据库上。下边这一个迁移新建贰个表:

class CreatePublications < ActiveRecord::Migration[5.0]
  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 会追踪哪些迁移已经采纳到数据库上,还提供了回滚作用。为了创造表,要推行rails db:migrate 命令。假诺想回滚,则进行 rails db:rollback 命令。

只顾,上边的代码与实际的数据库类别非亲非故,可用以 MySQL、PostgreSQL、Oracle 等数据库。

二、Active Record 数据库迁移

搬迁是 Active Record 的壹性格子,允许大家按时间顺序关押数据库方式。有了迁移,就不必再用纯 SQL 来更正数据库情势,而是能够接收简易的 Ruby DSL 来描述对数据表的匡正。

1)迁移概述
搬迁是以平等和自由自在的诀窍按期间各类修改数据库格局的实用方法。它应用 Ruby DSL,因而不必手动编写 SQL,进而达成了数据库毫不相关的数据库情势的创立和改造。

我们能够把迁移看做数据库的新“版本”。数据库形式一初阶并不分包别的内容,之后通过三个个搬迁来加多或删除数据表、字段和笔录。Active Record 知道怎样沿着时间线更新数据库格局,使其从别的历史版本更新为新型版本。Active Record 还大概会更新 db/schema.rb文件,以同盟最新的数据库构造。

示例:

class CreateProducts < ActiveRecord::Migration[5.0]
  def change
    create_table :products do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end
end

以此迁移用于增加 products 数据表,数据表中蕴藏 name 字符串字段和 description 文本字段。同临时间隐式增多了 id 主键字段,那是富有 Active Record 模型的私下认可主键。timestamps 宏增加了 created_at 和 updated_at 七个字段。后边那多少个新鲜字段只要存在就都由 Active Record 自动管理。

对于帮忙工作并提供了用于修正数据库方式的话语的数据库,迁移棉被服装进在职业中。若是数据库不协助职业,那么当迁移失利时,已成功的那有个别操作将不能够回滚。这种情状下只好手动完结相应的回滚操作。

某个查询不能够在事情内部运营。假如数据库适配器扶植 DDL 事务,就能够使用 disable_ddl_transaction! 方法在某些迁移中权且禁用事务。
一经想在搬迁中完结都部队分 Active Record 不知怎么着撤废的操作,还行reversible 方法:

class ChangeProductsPrice < ActiveRecord::Migration[5.0]
  def change
    reversible do |dir|
      change_table :products do |t|
        dir.up   { t.change :price, :string }
        dir.down { t.change :price, :integer }
      end
    end
  end
end

依然用 up 和 down 方法来代表 change 方法:

class ChangeProductsPrice < ActiveRecord::Migration[5.0]
  def up
    change_table :products do |t|
      t.change :price, :string
    end
  end

  def down
    change_table :products do |t|
      t.change :price, :integer
    end
  end
end

2)创制迁移

2-1)成立独立的动员搬迁
搬迁文件积累在 db/migrate 文件夹中,三个搬迁文件满含二个迁移类。文件名选取YYYYMMDDHHMMSS_create_products.rb 格局,即 UTC 时间戳加上下划线再增加迁移的名称。迁移类的名称(驼峰式)应该协作文件名中迁移的名目。比方,在 二零零六09061二零零一0_create_products.rb 文件中应当定义 CreateProducts 类,在 二〇一〇09061二零零一1_add_details_to_products.rb 文件中应该定义 AddDetailsToProducts 类。Rails 依据文件名的年月戳部分规定要运维的动员搬迁和迁移运营的相继,由此当必要把迁移文件复制到其他Rails 应用,大概自身生成迁移文件时,应当要当心迁移运维的各样。

自然,总括时间戳不是怎么样旧事,因而 Active Record 提供了生成器:

$ bin/rails generate migration AddPartNumberToProducts

地方的命令会创建空的搬迁,并打开适当命名:

class AddPartNumberToProducts < ActiveRecord::Migration[5.0]
  def change
  end
end

2-2)模型生成器
模型和脚手架生成器会转移适用于增加新模型的迁徙。那一个迁移中一度富含用于创设有关数据表的授命。假设大家告知 Rails 想要哪些字段,那么丰硕这个字段所需的口舌也会被创设。举个例子,运转上边的下令:

$ bin/rails generate model Product name:string description:text

下边包车型客车命令会创制上边包车型大巴迁徙:

class CreateProducts < ActiveRecord::Migration[5.0]
  def change
    create_table :products do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end
end

咱俩得以依赖必要加上“字段名称/类型”对,未有数据限定。

2-3)传递修饰符

能够一向在命令行中传送常用的类型修饰符。这几个项目修饰符用大括号括起来,放在字段类型之后。举个例子,运营上边包车型客车授命:

$ bin/rails generate migration AddDetailsToProducts 'price:decimal{5,2}' supplier:references{polymorphic}

地方的命令会创设上边包车型大巴搬迁:

class AddDetailsToProducts < ActiveRecord::Migration[5.0]
  def change
    add_column :products, :price, :decimal, precision: 5, scale: 2
    add_reference :products, :supplier, polymorphic: true, index: true
  end
end

3)编写迁移

应用生成器创立迁移后,就能够起来写代码了。

3-1)创造数据表

create_table措施是最根基、最常用的措施,其代码平时是由模型或脚手架生成器生成的。标准的用法像上面那样:

create_table :products do |t|
  t.string :name
end

上边包车型客车命令会成立蕴涵 name 字段的 products 数据表(前面会介绍,数据表还带有自动创立的 id 字段)。
暗中同意意况下,create_table 方法会创制 id 主键。能够用 :primary_key 选项来校订主键名称,还足以流传 id: false 选项以禁用主键。若是需求传递数据库特有的选项,能够在 :options 选项中应用 SQL 代码片段。举个例子:

create_table :products, options: "ENGINE=BLACKHOLE" do |t|
  t.string :name, null: false
end

地点的代码会在用来创制数据表的 SQL 语句末尾加上 ENGINE=BLACKHOLE(要是利用 MySQL 或 MarialDB,默许选项是 ENGINE=InnoDB)。
仍为能够传递带有数据表描述音讯的 :comment 选项,这一个注释会被累积在数据库中,能够动用 MySQL Workbench、PgAdmin III 等数据库管理工科具查看。对于大型数据库,强列推荐在选取的动员搬迁中增加注释。近期唯有MySQL 和 PostgreSQL 适配器扶助注释作用。
3-2)创制联结数据表
create_join_table 方法用于创制 HABTM(has and belongs to many)联结数据表。规范的用法像上面那样:

create_join_table :products, :categories

上边的代码会创制包括 category_id 和 product_id 字段的 categories_products 数据表。这多个字段的 :null 选项默许设置为 false,能够透过 :column_options 选项覆盖这一设置:

create_join_table :products, :categories, column_options: { null: true }

联合数据表的名目暗中同意由 create_join_table 方法的前多少个参数按字母顺序组合而来。能够流传 :table_name 选项来自定义联结数据表的名目:

create_join_table :products, :categories, table_name: :categorization

地点的代码会成立 categorization 数据表。
create_join_table 方法也承当块作为参数,用于增多索引(暗许未制造的目录)或附加字段:

create_join_table :products, :categories do |t|
  t.index :product_id
  t.index :category_id
end

本文由威尼斯在线注册平台发布于威尼斯登录首页,转载请注明出处:威尼斯登录首页Record模式吧数据存取逻辑作为对象的一部分,通过图书对象关联的作者对象

上一篇:威尼斯登录首页第一介绍的是三个从目录读取的函数,首先是从目录读取的函数 下一篇:没有了
猜你喜欢
热门排行
精彩图文