作者giive (lala)
看板Ruby
标题别墨守成规
时间Fri Oct 13 07:24:20 2006
出自我的blog
http://lightyror.blogspot.com/2006/10/blog-post_13.html
Convention Over Configuration 是 Ruby on Rails 提出的原创概念
的确有效的加快开发的速度,并且减少了设定档的量
但是,正如大家所说的
规则是用来打破的
我在开发期间发现了有一个情况不适合墨守成规
而应该多花一点点时间来作多余的设定
假如一个 Email 拥有两个属性,寄件者跟收件者
两个都是对应到 people 这个table
所以 Email 跟 people 是拥有两个 1 : 1 的关系
这时候,如果依照 convention over configuration
我们一定要手动额外设定另外一个关系
但是另外一个关系可以直接使用预设的 foreign key,也就是 person_id
也就是说,我们手边有两种选择
* Email table 里面有两个 foreign key ,一个是 person_id ,另一个是 sender_person_id,这时候 person_id 代表的是收件者,必须在 Email Model 多设定一行 has_one :sender , :foreign_key => 'sender_person_id' , :class_name => 'people'
* Email table 里面有两个 foreign key ,一个是 person_id ,另一个是 receiver_person_id,这时候 person_id 代表的是寄件者,必须在 Email Model 多设定一行 has_one :sender , :foreign_key => 'sender_person_id' , :class_name => 'people'
这里的 person_id 可以代表寄件者或是收件者,全凭另外一个栏位来取决
其实这样依照 database 来看也算蛮清楚的,设定也只需要多一行即可
运作也绝对没问题
但是可以 work 并不代表好
当我在使用的时候
我发现到,除非我特别回去看 database 的栏位去确认
否则我还是无法记起来,到底 Email.find(1).user 这里的 user
代表的是寄件者还是收件者
Rails 的开发是为了 agile 为目标,所有设定都是以简洁有力为依归
而非自己混乱自己
所以当我决定将 database 栏位改为
Email table 里面有两个 foreign key ,一个是 receiver_person_id ,另一个是 sender_person_id,
我们必须在 Email Model 多设定两行
has_one :sender , :foreign_key => 'sender_person_id' , :class_name => 'people'
has_one :receiver , :foreign_key => 'receiver_person_id' , :class_name => 'people'
但是获得的利益是我可以相当行云流水的写出
Email.find(1).receiver 或是 Email.find(1).sender
如此的程式
虽然我们违反了 Convention over Configuration 的规则
但是产生的 code 却跟原本 Ruby on Rails 一样简洁有力
心得
我认为 Convention over Configuration 是一个相当相当有效率的设计
他也让 Ruby on Rails coding 变得很美好
但是这个规则不是圣经
当遇到有一些特定的情况,我们必须要适时打破他
人生,也不就是这样
有时候你得适时的改变你既定的作法,像是放下身段,放下原本赖以维生的圭臬
才能获得更好的成果
其实这东西老祖宗早就讲过了,孟子有说,你们有没有在听呀
尽信书,不如无书
喵,就是这样
--
lighty RoR 是一个介绍 lighttpd , SQLite , Ruby and Rails 的 Blog
http://lightyror.blogspot.com/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.230.100.195
※ 编辑: giive 来自: 61.230.100.195 (10/13 07:33)
1F:推 yzugsr:推一个 10/13 12:08
2F:推 MAYLING:推! 10/13 14:08
3F:推 hiroshiyui:好文,多谢分享 10/14 09:37
4F:推 qazxsw99:推 10/19 20:12