9

我无法理解 Ruby on Rails 中的 ORM。据我了解,表/列和对象/属性之间存在 1:1 的关系。所以每条记录都是一个对象。还有什么是模型?我知道它映射到一张桌子。

我真正追求的是对上述内容的更深入理解。预先感谢您的帮助

我是一名从 PHP 转向 Ruby on Rails 的 Web 开发人员。

4

7 回答 7

25

“据我了解,表/列和对象/属性之间存在 1:1 的关系。所以每条记录都是一个对象。”

这并不完全正确,除非您非常松散地使用术语“对象”。表由建模,而表记录由这些类的实例建模。

假设您有一个clients表,其中包含id(autonum) 和name(varchar) 列。假设它只有一条记录,id=1 和 name="Ford"。然后:

  • DB 表clients将映射到模型类Client
  • 记录将映射到模型实例,这意味着您必须创建对象并将其分配给变量才能使用记录。最常见的方法是ford = Client.find(1)
  • 表的两列将映射到ford变量上的方法。你可以做ford.id,你会得到 1。你可以做ford.name,你会得到字符串“福特”。您还可以通过执行更改客户端的名称ford.name = "Chevrolet",然后通过执行 ford.save 将更改提交到数据库。

“还有一个模型到底是什么?我知道它映射到一个表”

模型只是具有许多用于操作数据库的非常有用的方法的类。这里有些例子:

  • 验证:除了典型的 db 驱动验证(“此字段不能为空”)外,您还可以在 ruby​​ 中实现许多复杂的验证(“此字段必须是有效的电子邮件”是最典型的验证)。验证在您对模型实例调用“保存”之前运行。
  • 关系:外键也可以映射到模型上。例如,如果您有一个通过外键与您的福特客户关联的brands表(及其相应的模型),您可以这样做并且您将获得一个对象数组,该对象表示brands 表上所有client_id = 1 的记录。Brandford.brands
  • 查询:模型允许您在 ruby​​ 中创建查询,并将它们自己转换为 SQL。大多数人都喜欢这个功能。

这些只是一些例子。活动记录提供了更多功能,例如翻译、查询范围或对单表继承的支持。

最后但同样重要的是,您可以将自己的方法添加到这些类中。

模型是不编写“意大利面条代码”的好方法,因为您被迫按功能分离代码。

  • 模型处理数据库交互和业务逻辑
  • 视图处理 html 呈现和用户交互
  • 控制器将模型与视图连接起来
于 2009-12-21T18:44:00.987 回答
15

Rails 中的 ORM 是Martin Fowler 的企业应用程序架构模式一书中的Active Record模式的实现。因此,Rails ORM 框架被命名为 ActiveRecord。

基本思想是将数据库表包装到一个类中,并且对象的一个​​实例对应于该表中的单行。因此,创建一个新实例会在表中添加一行,更新对象会更新行等。包装类为表中的每一列实现属性。在 Rails 的 ActiveRecord 中,这些属性是使用基于数据库模式的 Ruby 元编程自动提供的。如果需要引入额外的逻辑,可以根据需要覆盖这些属性。您还可以添加所谓的虚拟属性,它们在底层数据库表中没有对应的列。

Rails 是一个模型-视图-控制器(MVC) 框架,因此 Rails 模型是MVC中的M。除了作为上面描述的 ActiveRecord 包装类之外,它还包含业务逻辑,包括由 ActiveRecord 的 Validation 模块实现的验证逻辑。

延伸阅读

于 2009-12-17T15:20:38.787 回答
2

模型:领域对象,例如User,AccountStatus. 模型不一定由数据库后端支持,例如Status可以只是一个简单的静态类型枚举。

活动记录

提供查询数据库表的动态方法。数据库表定义为继承 ActiveRecord 类的类(伪 PHP 示例):

class User extends ActiveRecord {}

//find a record by name, and returns an instance of `User`
$record = User::find_by_name("Imran");
echo $record->name; //prints "Imran"

//there are a lot more dynamic methods for quering

通过创建 ActiveRecord 继承类的新实例来创建新记录:

class Account extends ActiveRecord {}

$account = new Account();
$account->name = "Bank Account"; 
$account->save();
于 2009-12-22T11:54:42.093 回答
1

来自维基百科的定义

计算机软件中的对象关系映射(ORM、O/RM 和 O/R 映射)是一种编程技术,用于在关系数据库中的不兼容类型系统和面向对象的编程语言之间转换数据。这实际上创建了一个可以在编程语言中使用的“虚拟对象数据库”。

从 PHP 视图来看,它将采用以下方式(通过示例)

  1. 连接到数据库并从帖子表中获取一些行。
  2. 将该行转换为具有类似于表格列中的属性的对象。
  3. 如果帖子在评论表中有评论,您也可以做 post.comments 并且您也可以将评论作为对象数组获得。

您可以定义表之间的关系,例如:Posts has_many Comments,Comment 属于 post 等等。

因此,基本上您不是在使用数据库行,而是将这些行及其关系转换为具有组合或继承关系的对象。

于 2009-12-17T15:11:40.497 回答
1

这里有两个部分:ORM 和 Rails 的 MVC 模式。ORM 是“对象-关系映射”的缩写,它的作用与它所说的差不多:它将数据库中的表映射到您可以使用的对象。

MVC 是“模型-视图-控制器”的缩写,该模式描述了 Rails 如何将您的域行为和对象表示转化为有用的页面。MVC 模式分为三个部分:

  • 模型包含定义域中的对象代表什么,以及它与其他模型的关系。它还描述了对象中表示的字段和关系如何映射到后备存储(例如数据库)。请注意,就其本身而言,模型并没有规定您必须使用特定的 ORM(甚至根本就不是 ORM)。

  • 控制器指定模型应如何相互交互以产生有用的结果以响应用户请求。

  • 视图获取控制器创建的结果并以所需的方式呈现它们。(当你看到你的视图时,你应该主要知道正在渲染什么,并且应该很少有行为发生。)

于 2009-12-17T15:15:24.647 回答
1

通俗地说。

  • Rails模型是数据库中表的代理。这些模型恰好是 Ruby 类。
  • 这些类的对象是该模型作为代理的表中的行的代理。
  • 最后,这些对象的属性是该特定行的列数据的代理。

上面实际上是 Rails ActiveRecord ORM。

于 2009-12-17T15:26:50.340 回答
0

1:1 不太正确,因为存在对象关系阻抗不匹配

于 2009-12-17T15:05:44.573 回答