新手问题 同学们,你们是如何实现ORM的?

zacker330 · 2013年01月24日 · 最后由 jasl 回复于 2013年01月26日 · 4187 次阅读

熟悉 java 下的 jpa 或者 hibernate 的同学都知道,只要在注解为了@Entity的类中加入A字段,然后构建一次项目,那么相应的数据库的表的就会添加一个名为A的列。这样的确方便,但,如果修改了数据库的结构后,你必须手工的写 sql 来进行数据迁移。

我现在的问题就是在 Rails 中,在现有的 model 中加入一个属性B,那么,我就必须手工地生成相应的 migrate?

active_record 是跟着数据库走的,你只要 migrate,model 就会有这个属性

#1 楼 @jjym 有 migrate model 这个命令么? 我只知道分别有 rails g migrate 和 rails g model,但不知道还有同时 rails g migrate model

可能是我没说明白。 我想我在新建好 model 后,或者编辑过 model 类后,不需要我手工的写相应的 migrate。

#2 楼 @zacker330 加了个逗号,这下没歧义了.....active_record 必须 migrate...

#5 楼 @jjym 也许是我从 java 那边转过来,思维方式没转过来。因为我用 hibernate 的时候,从来不需要考虑数据库,只需要考虑你这个实体需要哪些属性。而用 rails,你必须考虑数据库表应该怎么建。

通常命令就好了,不用手写

rails g generate migration add_foo_field_to_bars foo:string
rake db:migrate

rails g model the_new_model foo:string:index
rake db:migrate

目前有哪些字段,在 db/schema.rb 可以看到

我理解 ActiveRecord 是以数据库为中心的 但是 rails 也不是一定要用 active_record MongoDB 之类的 schema-free 数据库可以在 model 中指定 fields,改了也不用 migrate

#7 楼 @qhwa 嗯。我知道有这些命令,但这些命令,还是一样需要人打。 我希望的是,我写好一个 model 后,就意味着的我的表也建立好了。

#8 楼 @zacker330 为什么不尝试转变你的思维,如果你一直用 hibrnate/jpa 的思想来用 active_record,以后只会越来越困难。比如假设你以前用 struts2 或 spring mvc,你习惯用注解来配置路由,但是 rails 就是写 routes.rb,尝试去理解和转换你的思想

#8 楼 @zacker330 根据 model 自动建表写的时候方便,但是修改的时候不方便。比如一个字段 column1 要改名为 column2,系统不知道是要把 column1 改为 column2 还是删除 column1 然后新建 column2。使用 migration 还可以在 migration 文件里面加入业务逻辑

Hibernate 还不是要映射一下,跟 rails migrate 一下不是一个道理么

#11 楼 @Yujing_Z 我使用 Hibernate 的时候,是不写 xml 配置的,而是直接在属性上写@注解,

#9 楼 @kenshin54 嗯,我正在尝试转变的我思维的。只不过,我是要知道能不能在不转变的前提下使用 rails。路由方面,rails 的确很强大,而且,我也很喜欢。但。orm 方面,我倒不觉得,我更希望是像 jpa,hibernate 一样的。

#13 楼 @zacker330 你需要的根本转变是 Java -> Ruby, 从 static typing 到 dynamic typing 的编程语言。

#14 楼 @knwang 动态语言我一直都喜欢,我很早以前就学 python 了。这种思维方式的转变,我是可以转过来了的,而且,我用 java 的时间只有一年半,而且,这一年半的时间里,我更没有深入的学习 java。 第二,我的前几帖子里,我说的只一个 ORM 的概念问题,和语言无关的。

ActiveRecord 里面是不需要写字段描述的,而当你写 Migration 的时候不就和你直接在 Hibernate 里面定义字段一样么? 这有啥区别?

#16 楼 @huacnlee 最终是一样的效果,但这样就是需要我在写类的时候,必须要先考虑数据表怎么建,而不是先考虑类怎么设计。 第二,当你想调用 Comment 类某个属性的时候,你打开 Comment 类,却发现里面什么也没有,这样不奇怪吗。 第三,字段和属性是两个概念。字段是数据库表中的概念,而属性是面向对象中类的概念。

#17 楼 @zacker330

当你在写 Model 的时候实际上也就是设计表的过程,除非你都没有考虑字段类型,长度什么的,所以哪里写都是一样的。

至于第二点,ActiveRecord 的 Model 里面没有列出各个字段,在有些时候确实不方便,但是回过头来想,其实大多时候那些字段我都能记得,只有少数的情况会忘记一两个,所以写不写都没什么关系了。而没有这些描述所带来的好处是 Model 那个文件里面干净了很多,剩下的都是和业务有关的逻辑代码,以 Ruby China 这个 user.rb 来说,直接可以少 70 行的代码。

#18 楼 @huacnlee 嗯。我明白你的意思。 第一点,我在写 Model 的时候,是可以理解为在设计表的过程,但,更重要不是设计表,而是设计类。更先设计类,再设计表,才不会被“表”给绑定,这样才可以将类设计得更合理。 第二,“大多时候字段我都记得”,那只是你记得,但,后来人呢? 代码的干净不是说少多少多少代码的,而是 api 设计的无歧意性,以及最小惊奇化。“剩下的都是和业务有关的逻辑代码”,类中的属性是和业务有关的。

用 migrate 可以更好维护数据库中表结构的定义,而且可以做版本控制。

#19 楼 @zacker330 后来的人看看表结构或 schema.rb 文件不就好了,来来回回就那些字段有多难啊,记不住的情况只能说明命名不好或是用得少的字段。

我所说的意思是,字段的结构并不是需要随时看的,所以 Model 文件里面有没有字段描述不太重要。况且,又不是没有,真忘记的时候打开一下 schema.rb 或是数据库看就好了,这和你打开一个 model 文件所需要的过程不是一样的么?! 都是打开一个文件。

#21 楼 @huacnlee 他最核心的想说的就是,我丫打开 user.rb 竟然都不能知道 users 这个表神马结构,rails 太不 orm 了,还要 migrate!

虽然最麻烦也就是看下 schema.rb,而且不熟悉的可以在 model 里面 annotate 下。我也不明白这个比 hibernate 麻烦在哪

用 rubymine 吧,智能提醒 Model 属性。打开 schema.rb 也很方便:ctrl+p,输入 sch,按回车

orm 虽然是概念,但是 hibernate 明显不能实现的像 ar 优雅,这是语言决定的。 动态语言的 orm 可以通过查询外模式获得字段信息,hibernate 本能也这样但受限于 java 不能运行期修改类定义 所以 ar 的 orm 是和 db 直接相关的,migration 如本身意思迁移是提供一套 dsl 方便你操作数据库的定义

需要 登录 后方可回复, 如果你还没有账号请 注册新账号