Ruby 板


LINE

出自我的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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP