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,并以创建时间倒序排列的对象

users = User.where(name: 'David', occupation: 'CodeArtist').order('created_at DESC')

             你将在Active Record Query Interface章节学到更多。

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章节获取更多信息。
0 0
原创粉丝点击