什么是Ruby on Rails ORM的外行人的术语?请解释

时间:2009-12-17 15:00:53

标签: ruby-on-rails oop orm rails-activerecord

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

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

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

7 个答案:

答案 0 :(得分:24)

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

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

假设您有一个clients表,列id(autonum)和name(varchar)。假设它只有一条记录,id = 1,名字=“Ford”。然后:

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

“究竟什么是模型?我知道它映射到表格”

模型只是具有 lot 的类,用于操作数据库非常有用的方法。以下是一些例子:

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

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

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

模型是不写“spaguetti代码”的好方法,因为你不得不按功能分开你的代码。

  • 模型处理数据库交互和业务逻辑
  • 视图处理html呈现和用户交互
  • 控制器连接带有视图的模型

答案 1 :(得分:15)

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

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

Rails是一个Model-View-Controller(MVC)框架,因此Rails模型是MVC中的 M 。它不仅是上面描述的ActiveRecord包装类,还包含业务逻辑,包括由ActiveRecord的Validation模块实现的验证逻辑。

进一步阅读

答案 2 :(得分:2)

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

<强> ActiveRecord的

提供用于查询数据库表的动态方法。数据库表被定义为继承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();

答案 3 :(得分:1)

来自维基百科的definition

  

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

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

  1. 连接到数据库并从帖子表中获取一些行。
  2. 将该行转换为具有表格列中属性的对象。
  3. 如果帖子在评论表中有评论,你也可以做post.com,你也可以把评论作为一个对象数组。
  4. 您可以定义表之间的关系,例如:帖子has_many评论,评论属于帖子等等。

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

答案 4 :(得分:1)

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

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

  • 模型包含域中对象所代表的内容的定义,以及它与其他模型的关联方式。它还描述了对象映射到后备存储(例如数据库)中的字段和关系。请注意,本身没有任何关于模型的规定,你必须使用特定的ORM(甚至是ORM)。

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

  • 视图获取控制器创建的结果并以所需方式呈现它们。 (当你看到你的观点时,你应该大部分都知道正在渲染的内容,并且应该发生很少的行为。)

答案 5 :(得分:1)

外行人的说法。

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

上面实际上是Rails ActiveRecord ORM。

答案 6 :(得分:0)

1:1不太正确,因为有object-relation impedance mismatch