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

Imr*_*ran 9 oop orm ruby-on-rails rails-activerecord

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

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

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

kik*_*ito 24

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

这不完全正确,除非你非常宽松地使用术语"对象".表由建模,而表记录这些类实例建模.

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

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

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

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

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

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

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

模型是不编写"spaguetti代码"的好方法,因为您不得不按功能分离代码.

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


Joh*_*ley 15

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

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

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

进一步阅读