新手问题 rails 中的ORM概念的疑问。

zacker330 · 2013年01月24日 · 最后由 wppurking 回复于 2013年01月25日 · 4626 次阅读

这其实是一个ORM的问题。一般来说实体中有什么属性,那么它相应的数据库的表中才会有相应的字段。 比如 Comment 实体中,有 title 和 content 属性,这样 comments 表中就会有 title 和 content 字段。 但,我在看视频 http://railscasts-china.com/episodes/rails-tutorial 时就发现:发现实体 Comment 中没有 content 属性,但,同样可以实现ORM。 这是为什么呢》

因为有一个belongs_to :post,comments 表中有一个 post_id,关联 posts 表。

但,Comment 实体不应该有一个 content 属性吗?

content 不是属于 comment 的,而是属于 post。

这个相当于 sql 中联合两个表查找。

#3 楼 @AlphaLiu 我说的 content 指的是 comment 的内容,而不是 post 的内容。

#4 楼 @zacker330 好吧,我明白你的意思了。comment model 中确实不用显式写出属性,rails 在暗地里做了一些工作,它会知道你的 model 有什么字段属性的。

#5 楼 @AlphaLiu 这就是一个问题了,如果这个应用的维护者看到这个实体。发现里面什么都没有,那还有什么可读性可言呢?

#6 楼 @zacker330 可以写注释,可以看 schema,可以写文档。

比如

#6 楼 @zacker330 这个确实是问题.. 程序的可读性会有影响。无论用什么方式解决,原生的 AR 都没有提供解决方案。

我就在静等 DataMapper 2 了..

惯例优于配置 (Convention over Configuration)

#9 楼 @Ddl1st 这与惯例优于配置是两码事

#8 楼 @Saito 有啥问题?最麻烦最麻烦的就是看下 schema,更何况现在都有自动 annotate

#12 楼 @qhwa 我说的就是那个意思。

#8 楼 @Saito http://rails-erd.rubyforge.org/ 这个也挺好用。不过其实我都不看的,直接看数据库里的字段。。

#13 楼 @zacker330 不这样做也没什么不好,想知道一个类有什么字段的方法太多了 随时可以用 Foo.columns 或者 Foo.column_names 查 你担心新的开发者不好维护,程序可读性降低,我觉得只是因为不习惯而已,实际上用下来并没有问题

#14 楼 @hooopo 实际上 Rails 一直以来都有两个问题是比较困扰的,现在不觉得只是因为都瘸习惯了而已..

1>. Model 的字段不明,这个在 Java 还真不是问题,因为 Java 会区分 field 和 method 的调用方式。该加 () 加 (). rubyist 早就习惯不加 () 的调用方式了。导致看代码过程中你无法区分是 field 还是 method. 就需要回头看 schema.rb 或者 直接瞄数据库..

2>. Controller 的 Mapping 不明,这个在 Java 上也不是问题.. 因为 Java 现在的实现方式都是 Annotation( 直接标注在方法上).. 往往在 debug 的时候经常会某个 url 出错,需要立即进入对应的 Controller 看看代码。发现你得先进 routes.rb 看看到底是哪个东西映射的。尤其在 Rails 4 之后,routes Concern 加进来,找都找不着...

很多人说:你瘸了,我卖你副拐吧.. annotate, rake routes | grep 两副拐到手,你终于能走正步了..

出门跟邻里相亲打招呼,发现为啥就自己需要拄拐。哀叹自己遗传基因不好.. 听天由命。

突然旁边就走来一个大叔面带微笑:

!![]((http://d.pr/i/4j5X+)

潜心修炼两个时辰,你就脱拐了.. 仔细询问邻里相亲,发现他们都是这样脱拐的。..

其实书里面只写着三个单词:你将整书付之一炬,刻与村头木板石碑,退隐江湖,深藏功与名。

石碑上刻着: . . . ^^^^^^^^^^^^^^^^^^^ | # Sinatra + DataMapper | vvvvvvvvvvvvvvvvvvvvvv

@Saito 哈哈哈,生动~

其实我现在 Java 里面有字段提示,很多时候还是会去看数据库。特别是有时候会需要跳过 JPA 用 SQL 去查询东西的时候。

#17 楼 @wppurking 不是吧。有这么严重么,我第一次听说需要这样子做的。

虎大王同学@zacker330 你可能需要 ruby 另外一套 orm http://datamapper.org/getting-started.html

#18 楼 @zacker330 JPA 和 SQL 并存的,基本操作会通过 JPA, 但相当复杂的会跳过 JPA(不使用 JPQL) 用 SQL 查询。按照 JPQL 一点一点下去写下去,还不如直接 SQL 加载复杂查询所需要的数据,当然这些数据只读。在 Ruby 里面忘掉 Java 的处理方式会更容易接受。

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