高层函数?
高阶函数!!!
可以试试改成 SSH 接口,这样写脚本就方便了
说明 JavaEye 已经从 Rails 2.x 升级到 3.x 了?
你把问题搞混了吧,你说的两条优点对于 ORM 来说是不成立的。
只有你自己写 SQL 语句的时候,才能体现出SELECT *
打字少且在添加和修改或删除的时候不需要更改查询语句的优势。
为什么不要用SELECT *
?就是为了能在执行 SQL 语句的时候就出错,而不是在模板或者其他什么地方出错。
这个说法是有问题的吧。看 Unicode 文档,CJK 是分成好几段的
http://www.unicode.org/versions/Unicode6.0.0/ch12.pdf
0x3400 ~ 0x4DBF
0x4E00 ~ 0x9FFF
0xF900 ~ 0xFAFF
0x20000 ~ 0x2A6DF
0x2A700 ~ 0x2B73F
0x2B740 ~ 0x2B81F
0x2F800 ~ 0x2FA1F
一 - 龠 也就 4E00 ~ 9FA0 龥 也就 9FA5
#10 楼 @knwang 看那样子就变成 data mapper 了。但我没发现你举的这个例子,在两个 pattern 里有啥区别
http://martinfowler.com/eaaCatalog/activeRecord.html http://martinfowler.com/eaaCatalog/dataMapper.html
现在 Django 分得很坑爹,搞了个半调子的 Form,弄得你用也不是不用也不是。
比如就像 GitHub 那样,每个用户的自己的仓库是不能重名的。
Django 里面你在 model 里定义unique_together = [('user', 'repository_name')]
接着,因为 user 是从 session 那里拿到的,你用 Django 自带的 ModelForm 生成 Form 的时候,会去 exclude user 这个 column。(这个是文档里提到的做法,https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#using-a-subset-of-fields-on-the-form)
问题就来了,Django 的validate_unique
的时候,因为 user 被 exclude 了,unique_together 里面,('user', 'repository_name')
这条就直接就无视了。
据我所知 Django 到现在也没一个标准做法来处理这个问题。这个问题也不是一天两天了,是 4 年多了,这个问题一直没解决。
https://code.djangoproject.com/ticket/8795#comment:11 https://code.djangoproject.com/ticket/12028 https://code.djangoproject.com/ticket/12521 https://code.djangoproject.com/ticket/12901 https://code.djangoproject.com/ticket/13091 https://code.djangoproject.com/ticket/13249 https://code.djangoproject.com/ticket/15326
当然了,我承认在 Ruby 社区吐槽 Django 是很不好的行为。只是看到这个话题,联想到 Django 有个坑爹的问题,就顺便吐槽一下了。
#48 楼 @knwang 默认就建 Foreign Key 啊,别整个第三方的 gem,不然很多人就干脆不建 Foreign Key 了。不该迁就 MyISAM 这种功能不全的数据库引擎。
SQL 有啥功能,都要能在 ORM 里能体现出来。默认没有,很多第三方库就不会去用。差不多就相当与是把 RDBMS 当 key-value 存储用,这样,就会有人觉得 RDBMS 不好用。这也不难解释,现在有很多人会去折腾 MongoDB 这种适用范围很窄的东西。
Rails 核心开发者又不是水平不行,也不是相关部分的代码没写好,但就是能经常搞这种默认就不给你启用这种事情出来。还说啥 Rails 的默认设定是适合大多数人的,你没设对就是你水平不行,总之就是你自己的错。非要等到出事了才肯改一下默认设定。Rails 3 都号称 Secure by Default 了,还能连改 mass assignment 的默认设定都极不情愿。
不管怎么说,还是在往积极的方向发展么。模板默认会 escape 了,mass assignment 默认会过滤了。SQL 注入的问题也暴露出来了,补丁也有了。希望早一点能:默认只用数据库的客户端库来 escape,别自己 escape 了以及在参数上搞点花样,Foreign Key Constraint 默认能给我建好,除非我特别指定,别给我生成SELECT *
这样的 SQL 出来。
irb(main):001:0> a = [[0]*8]*8
=> [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
irb(main):002:0> a[0][0] = 1
=> 1
irb(main):003:0> a
=> [[1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0]]