我无法理解 Ruby on Rails 中的 ORM。据我了解,表/列和对象/属性之间存在 1:1 的关系。所以每条记录都是一个对象。还有什么是模型?我知道它映射到一张桌子。
我真正追求的是对上述内容的更深入理解。预先感谢您的帮助
我是一名从 PHP 转向 Ruby on Rails 的 Web 开发人员。
我无法理解 Ruby on Rails 中的 ORM。据我了解,表/列和对象/属性之间存在 1:1 的关系。所以每条记录都是一个对象。还有什么是模型?我知道它映射到一张桌子。
我真正追求的是对上述内容的更深入理解。预先感谢您的帮助
我是一名从 PHP 转向 Ruby on Rails 的 Web 开发人员。
“据我了解,表/列和对象/属性之间存在 1:1 的关系。所以每条记录都是一个对象。”
这并不完全正确,除非您非常松散地使用术语“对象”。表由类建模,而表记录由这些类的实例建模。
假设您有一个clients
表,其中包含id
(autonum) 和name
(varchar) 列。假设它只有一条记录,id=1 和 name="Ford"。然后:
clients
将映射到模型类Client
。ford = Client.find(1)
ford
变量上的方法。你可以做ford.id
,你会得到 1。你可以做ford.name
,你会得到字符串“福特”。您还可以通过执行更改客户端的名称ford.name = "Chevrolet"
,然后通过执行 ford.save 将更改提交到数据库。“还有一个模型到底是什么?我知道它映射到一个表”
模型只是具有许多用于操作数据库的非常有用的方法的类。这里有些例子:
brands
表(及其相应的模型),您可以这样做并且您将获得一个对象数组,该对象表示brands 表上所有client_id = 1 的记录。Brand
ford.brands
这些只是一些例子。活动记录提供了更多功能,例如翻译、查询范围或对单表继承的支持。
最后但同样重要的是,您可以将自己的方法添加到这些类中。
模型是不编写“意大利面条代码”的好方法,因为您被迫按功能分离代码。
Rails 中的 ORM 是Martin Fowler 的企业应用程序架构模式一书中的Active Record模式的实现。因此,Rails ORM 框架被命名为 ActiveRecord。
基本思想是将数据库表包装到一个类中,并且对象的一个实例对应于该表中的单行。因此,创建一个新实例会在表中添加一行,更新对象会更新行等。包装类为表中的每一列实现属性。在 Rails 的 ActiveRecord 中,这些属性是使用基于数据库模式的 Ruby 元编程自动提供的。如果需要引入额外的逻辑,可以根据需要覆盖这些属性。您还可以添加所谓的虚拟属性,它们在底层数据库表中没有对应的列。
Rails 是一个模型-视图-控制器(MVC) 框架,因此 Rails 模型是MVC中的M。除了作为上面描述的 ActiveRecord 包装类之外,它还包含业务逻辑,包括由 ActiveRecord 的 Validation 模块实现的验证逻辑。
模型:领域对象,例如User
,Account
或Status
. 模型不一定由数据库后端支持,例如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();
来自维基百科的定义:
计算机软件中的对象关系映射(ORM、O/RM 和 O/R 映射)是一种编程技术,用于在关系数据库中的不兼容类型系统和面向对象的编程语言之间转换数据。这实际上创建了一个可以在编程语言中使用的“虚拟对象数据库”。
从 PHP 视图来看,它将采用以下方式(通过示例)
您可以定义表之间的关系,例如:Posts has_many Comments,Comment 属于 post 等等。
因此,基本上您不是在使用数据库行,而是将这些行及其关系转换为具有组合或继承关系的对象。
这里有两个部分:ORM 和 Rails 的 MVC 模式。ORM 是“对象-关系映射”的缩写,它的作用与它所说的差不多:它将数据库中的表映射到您可以使用的对象。
MVC 是“模型-视图-控制器”的缩写,该模式描述了 Rails 如何将您的域行为和对象表示转化为有用的页面。MVC 模式分为三个部分:
模型包含定义域中的对象代表什么,以及它与其他模型的关系。它还描述了对象中表示的字段和关系如何映射到后备存储(例如数据库)。请注意,就其本身而言,模型并没有规定您必须使用特定的 ORM(甚至根本就不是 ORM)。
控制器指定模型应如何相互交互以产生有用的结果以响应用户请求。
视图获取控制器创建的结果并以所需的方式呈现它们。(当你看到你的视图时,你应该主要知道正在渲染什么,并且应该很少有行为发生。)
通俗地说。
上面实际上是 Rails ActiveRecord ORM。
1:1 不太正确,因为存在对象关系阻抗不匹配。