熟悉 java 下的 jpa 或者 hibernate 的同学都知道,只要在注解为了@Entity的类中加入A字段,然后构建一次项目,那么相应的数据库的表的就会添加一个名为A的列。这样的确方便,但,如果修改了数据库的结构后,你必须手工的写 sql 来进行数据迁移。
我现在的问题就是在 Rails 中,在现有的 model 中加入一个属性B,那么,我就必须手工地生成相应的 migrate?
通常命令就好了,不用手写
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
#8 楼 @zacker330 为什么不尝试转变你的思维,如果你一直用 hibrnate/jpa 的思想来用 active_record,以后只会越来越困难。比如假设你以前用 struts2 或 spring mvc,你习惯用注解来配置路由,但是 rails 就是写 routes.rb,尝试去理解和转换你的思想
#8 楼 @zacker330 根据 model 自动建表写的时候方便,但是修改的时候不方便。比如一个字段 column1 要改名为 column2,系统不知道是要把 column1 改为 column2 还是删除 column1 然后新建 column2。使用 migration 还可以在 migration 文件里面加入业务逻辑
#9 楼 @kenshin54 嗯,我正在尝试转变的我思维的。只不过,我是要知道能不能在不转变的前提下使用 rails。路由方面,rails 的确很强大,而且,我也很喜欢。但。orm 方面,我倒不觉得,我更希望是像 jpa,hibernate 一样的。
#13 楼 @zacker330 你需要的根本转变是 Java -> Ruby, 从 static typing 到 dynamic typing 的编程语言。
ActiveRecord 里面是不需要写字段描述的,而当你写 Migration 的时候不就和你直接在 Hibernate 里面定义字段一样么? 这有啥区别?
当你在写 Model 的时候实际上也就是设计表的过程,除非你都没有考虑字段类型,长度什么的,所以哪里写都是一样的。
至于第二点,ActiveRecord 的 Model 里面没有列出各个字段,在有些时候确实不方便,但是回过头来想,其实大多时候那些字段我都能记得,只有少数的情况会忘记一两个,所以写不写都没什么关系了。而没有这些描述所带来的好处是 Model 那个文件里面干净了很多,剩下的都是和业务有关的逻辑代码,以 Ruby China 这个 user.rb 来说,直接可以少 70 行的代码。
#19 楼 @zacker330 后来的人看看表结构或 schema.rb 文件不就好了,来来回回就那些字段有多难啊,记不住的情况只能说明命名不好或是用得少的字段。
我所说的意思是,字段的结构并不是需要随时看的,所以 Model 文件里面有没有字段描述不太重要。况且,又不是没有,真忘记的时候打开一下 schema.rb 或是数据库看就好了,这和你打开一个 model 文件所需要的过程不是一样的么?! 都是打开一个文件。
orm 虽然是概念,但是 hibernate 明显不能实现的像 ar 优雅,这是语言决定的。
动态语言的 orm 可以通过查询外模式获得字段信息,hibernate 本能也这样但受限于 java 不能运行期修改类定义
所以 ar 的 orm 是和 db 直接相关的,migration 如本身意思迁移
是提供一套 dsl 方便你操作数据库的定义