Rails 关于多对多,中间表的名称

douya0808 · 2012年04月09日 · 最后由 ruohanc 回复于 2012年09月21日 · 5778 次阅读

老师和课程是多对多的关系 那中间表写成 teachers_kechengs 和 kechengs_teachers 不是一样么?为什么在我的程序中写成后者就正确 写成前者就说找不到表呢?费解

中间表按照 model 的首字母顺序,另外英文和拼音互混合的命名方式不好。

杜绝拼音阿! PS. http://ihower.tw/rails3/activerecord-relationships.html 这样会不会更好? lecture_teacherships

@jokry 原来是这样啊 那 k 在 t 前面我就理解啦 谢谢

@ichord 昨天想用 lesson 来的 lesson 的复数好像还是 lesson 但是好像又不是 哈哈 最后我就用拼音啦 给我逼急了

谢谢二位:)

@ichord 对对对 我搜索 ror 东西的时候结果里总会有这个网站 但是用 IE 看不到里面的内容 我一直以为这网站有问题呢 刚才还 Chrome 就能看了 杯具啊

#2 楼 @ichord 啊.我按照 ihower 的这篇文章做得, 但是在中间表添加记录的时候出错

s1 = Supplier.create
r1 = Representative.create
Account.new(:supplier => s1, :representative => r1)

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: supplier, representative

目测是 model 里面没加 attr_accessible, 但是加上

attr_accessible :supplier, :representative

之后就变成了

ActiveRecord::AssociationTypeMismatch: Supplier(#70329520740200) expected, got Supplier(#70329532252340)

大概是因为 model 里面没有这两个属性吧? model 里面应该只有 :supplier_id 和 :representative_id

到底咋样才能正确的添加中间表记录啊..

随意。。

@ruohanc 最后,你怎么做的,我也遇到这个问题,想自己建 join table,暂时没找到方法,按照 ihower 不行。一样的错误提示

约定:中间表表名按字母语序排列!

这种情况一定好好好想中间表是不是也代表了业务逻辑。比如说, 老师和课程的中间表是什么,是不是可以叫 “授课”, “教课任务”, 等等? 要根据你的业务模型起一个合适的名字。 起了好名字往往会给你带来柳暗花明的感觉,比如说, 如果是个教务管理系统, 可能叫 “教学任务” 更合适。那么连带而来的,是不是有分配教课任务的人, 是不是可以取消, 修改? 每个教学任务老师是不是得到相应的报酬? 这些相应的业务逻辑一下子因为好的命名有了一个合适的地方,而不是在你的 CourseController 里面堆积。

如果应用是老师们用的系统, 可能这个更合适叫 “授课”,那么连带的比如说授课的效果, 每次授课的反馈等等,学生的出勤情况也可以和一个 “授课” 来做关联。 这些, 如果把中间表叫做 “kechengs_teachers"就很难想到。 那么相关的业务逻辑就会散落到应用的各个地方,难以维护。

最后, 这种选择更容易适应业务的变化。比如, 一但现在说每个课程两个老师来教一个主教一个助理, 如果你的模型叫 “kechengs_teachers", 你可能不知道如何入手。 如果你的模型叫 “授课 “,你会一下想到, 只要一个 “primary_teacher_id" 一个 ” assistant_teacher_id" 就可以了!多简单

"计算机科学里面只有两件难事 - 缓存过期和给东西命名" http://martinfowler.com/bliki/TwoHardThings.html

#9 楼 @zealinux hi~ 后来这个问题在这个 帖子 里面解决了。Rails 3.2 之后默认启用白名单,最后绕开这个问题的方法我给忘了,好久没写 rails 了

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