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

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

老师和课程是多对多的关系 那中间表写成 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 了

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