我无法理解Ruby on Rails中的ORM。根据我的理解,表/列和对象/属性之间存在1:1的关系。所以每条记录都是一个对象。 究竟什么是模型?我知道它映射到一张桌子。
我真正追求的是对上述内容的更深入理解。提前感谢您的帮助
我是一名从PHP到Ruby on Rails的Web开发人员。
答案 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 的类,用于操作数据库非常有用的方法。以下是一些例子:
brands
表(及其对应的Brand
模型)通过外键与您的福特客户端相关联,您可以执行ford.brands
并获得一个对象数组表示品牌表上具有client_id = 1的所有记录。这些只是一些例子。活动记录提供了更多功能,例如翻译,查询范围或支持单表继承。
最后但并非最不重要的是,您可以将自己的方法添加到这些类中。
模型是不写“spaguetti代码”的好方法,因为你不得不按功能分开你的代码。
答案 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)
模型:User
,Account
或Status
等域对象。数据库后端不一定支持模型,例如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视图中,它将采用以下方式(通过示例)
您可以定义表之间的关系,例如:帖子has_many评论,评论属于帖子等等。
所以基本上你不使用数据库行,而是将这些行及其关系转换为具有组合或继承关系的对象。
答案 4 :(得分:1)
这里有两个部分:ORM和Rails的MVC模式。 ORM是“对象 - 关系映射”的缩写,它完全符合它所说的:它将数据库中的表映射到可以使用的对象。
MVC是“模型 - 视图 - 控制器”的缩写,模型描述了Rails如何将您的域行为和对象表示转换为有用的页面。 MVC模式分为三个块:
模型包含域中对象所代表的内容的定义,以及它与其他模型的关联方式。它还描述了对象映射到后备存储(例如数据库)中的字段和关系。请注意,本身没有任何关于模型的规定,你必须使用特定的ORM(甚至是ORM)。
控制器指定模型应如何相互交互以产生有效的结果以响应用户请求。
视图获取控制器创建的结果并以所需方式呈现它们。 (当你看到你的观点时,你应该大部分都知道正在渲染的内容,并且应该发生很少的行为。)
答案 5 :(得分:1)
外行人的说法。
上面实际上是Rails ActiveRecord ORM。
答案 6 :(得分:0)
1:1不太正确,因为有object-relation impedance mismatch。