打印

[求助]关于has_one

[求助]关于has_one

请教大家 最近需要做一个功能 下面是大致的模型图

A表 B表 C表
↓  ↓  ↓has_one
[  D表  ]

A B 和 C 都有一个D 虽然我知道可以在C里面建立3个字段A_id\B_id\C_id就可以完成这样的功能

但是以后可能和D表的关联表很多 因为以后可能需要扩展

所以我准备用2个字段完成这样的关系

即item_id(记录A、B、C表的ID) item_type(记录类型A、B、C等类型)

比方说 D表里面某条记录 item_id = 9 item_type = A
我就可以知道 这条记录是志向A表 id=9的记录

这样写的时候 我create知道怎么写 但是destroy我却不知道应该如何去写

比方说A表中某一条记录被删除 对应的D表里面相应的一条记录也被删除

因为这样的关系has_one :A, :dependent => :destroy 并不能使用

不知道有没有什么其它的方法能够完成这样的功能? 或者说我这样设计有缺陷?

TOP

我觉得这样做违背了rails的约定,还是支持第一种做法
def keyword; end

TOP

你的意思是

A B 和 C 都有一个D 虽然我知道可以在C里面建立3个字段A_id\B_id\C_id就可以完成这样的功能

这样的话 那我如果有更多的对象和D关联 那么不是得无限条的在D里面增加字段吗?

这样的话 单独模块的开发的话 感觉Rails扩展性不太强哦

TOP

那你为什么有那么多表都要has_one D呢?
这是设计的问题,和rails没啥关系吧
def keyword; end

TOP

呵呵 问题解决了

这个属于多态关系 Polymorphic Associations

Agile.Web.Development.with.Rails.2nd.Edition.Dec.2006.pdf中 第349页详细的说明了这个问题

A的model里面 has_one: D , :as => :resource , :dependent => :destroy

D的model里面 belongs_to :resource, :polymorphic => true

这样就可以完成多态关系了

D 表中需要增加 resource_id  resource_type  两个字段 用来记录A中的ID 与 类型

一直在翻这个书 终于发现了 原来Rails中的多态用法

TOP

感谢keyword斑竹大人一直以来的关照

这个不是设计方面的问题

象这样的使用的话

我可以把功能分离出来

比方说 我做一个评论功能 然后使用这个功能 就可以直接去给项目中的某个功能增加上这个评论功能

也许是一篇文章的评论 也是一张图片的评论 这样的话 就算是真正的分离出模块来制作程序了

呵呵 上面只是打个比方 其实这样的使用应该很多地方都可以用到

上面把解决方法贴出来 希望大家以后遇到这样的情况可以少走弯路 就当是抛砖引玉了

TOP

总结得不错,俺也学习啦。。。。哈哈
def keyword; end

TOP

其实你应该先搜索一下,有没有其他人考虑过或者做过这方面的研究,甚至有可能已经有成熟的工具了?

如果是评论的话,搜索 acts_as_commentable ,看一下这个插件是怎么实现的
我就是鸡蛋黄……

TOP

非常感谢hozaka的建议

我接触Ruby on Rails不久

所以一些东西想自己多接触下 毕竟不是所有的功能都有plugin 有时候还是需要自己写一些功能

但是还是很感谢你的建议 我已经在看了  这个acts_as_commentable 我也比较感兴趣

TOP