Ruby on Rails - Active Record



Rails Active Record 是 Rails 提供的对象关系映射 (ORM) 层。它紧密遵循标准 ORM 模型,如下所示:

  • 表映射到类;
  • 行映射到对象;
  • 列映射到对象属性。

Rails Active Record 提供了关系数据库中的表与操作数据库记录的 Ruby 程序代码之间的接口和绑定。Ruby 方法名称会根据数据库表的字段名称自动生成。

每个 Active Record 对象都有用于数据库访问的 CRUD(**C**reate、**R**ead、**U**pdate 和 **D**elete)方法。此策略允许在数据库表和应用程序对象之间进行简单的设计和直接映射。

将领域模型转换为 SQL

将领域模型转换为 SQL 通常很简单,只要记住您必须编写 Rails 友好的 SQL 即可。实际上,您必须遵循某些规则:

  • 每个实体(例如 book)在数据库中都会得到一个以其复数形式命名的表(books)。

  • 每个这样的实体匹配表都有一个名为 *id* 的字段,其中包含插入到表中的每个记录的唯一整数。

  • 给定实体 x 和实体 y,如果实体 y 属于实体 x,则表 y 具有名为 x_id 的字段。

  • 任何表中的大部分字段都存储该实体简单属性的值(任何数字或字符串)。

创建 Active Record 文件(模型)

要为我们在上一章中介绍的库应用程序的实体创建 Active Record 文件,请从应用程序目录的顶层发出以下命令。

library\> rails script/generate model Book
library\> rails script/generate model Subject

上面的 **rails generate model book** 命令会生成如下自动代码:

Book Generate

您正在告诉生成器创建名为 Book 和 Subject 的模型,以存储书籍和主题的实例。请注意,您正在大写 Book 和 Subject 并使用单数形式。这是您每次创建模型都应遵循的 Rails 范例。

当您使用 generate 工具时,Rails 会创建实际的模型文件,其中包含模型特有的所有方法和您定义的业务规则,一个用于执行测试驱动开发的单元测试文件,一个示例数据文件(称为 fixture),用于与单元测试一起使用,以及一个 Rails 迁移,这使得创建数据库表和列变得容易。

除了创建许多其他文件和目录外,这还会在 **app/models** 目录中创建名为 **book.rb** 和 **subject.rb** 的文件,其中包含骨架定义。

book.rb 中的内容:

class Book < ActiveRecord::Base
end

subject.rb 中的内容:

class Subject < ActiveRecord::Base
end

创建模型之间的关联

当您的 Rails 应用程序中有多个模型时,您需要在这些模型之间创建连接。您可以通过关联来做到这一点。Active Record 支持三种类型的关联:

  • **一对一** - 当一个项目只有一个另一个项目时,存在一对一关系。例如,一个人只有一个生日,或者一条狗只有一个主人。

  • **一对多** - 当单个对象可以是许多其他对象的成员时,存在一对多关系。例如,一个主题可以有许多本书。

  • **多对多** - 当第一个对象与第二个对象的一个或多个相关联,而第二个对象与第一个对象的一个或多个相关联时,存在多对多关系。

您可以通过向您的模型添加声明来指示这些关联:has_one、has_many、belongs_to 和 has_and_belongs_to_many。

现在,您需要告诉 Rails 您想要在库数据系统中建立什么关系。为此,请修改 book.rb 和 subject.rb,使其如下所示:

class Book < ActiveRecord::Base
   belongs_to :subject
end

我们在上面的示例中使用了单数 subject,因为一本 Book 可以属于一个 Subject。

class Subject < ActiveRecord::Base
   has_many :books
end

我们在这里使用了复数 books,因为一个 subject 可以有多本书。

在模型上实现验证

验证的实现是在 Rails 模型中完成的。您输入数据库的数据在实际的 Rails 模型中定义,因此在同一位置定义有效数据意味着什么才是合理的。

验证包括:

  • title 字段的值不能为 NULL。
  • price 字段的值必须为数字。

打开 **app\model** 子目录中的 **book.rb** 并添加以下验证:

class Book < ActiveRecord::Base
   belongs_to :subject
   validates_presence_of :title
   validates_numericality_of :price, :message=>"Error Message"
end
  • **validates_presence_of** - 保护“NOT NULL”字段免受缺少用户输入的影响。

  • **validates_numericality_of** - 防止用户输入非数字数据。

除了上面提到的验证之外,还有其他一些常见的验证。查看 Rails 快速指南

接下来是什么?

在下一章中,我们将学习 Rails Migration,它允许您使用 Ruby 来定义数据库模式的更改,从而可以使用版本控制系统来使实际代码保持同步。

广告