【问题标题】:How could I be sure that choosing HABTM over has_many :through is more suitable?我怎么能确定选择 HABTM 而不是 has_many :through 更合适?
【发布时间】:2009-11-12 05:27:34
【问题描述】:
我听到很多关于 has_many :through(HMT) 与 has_and_belongs_to_many (HABTM) 的讨论。 This post 涵盖了它的大部分好处。好的,HMT 肯定比HABTM 有一些真正的好处。但是,我想知道什么时候应该知道我应该使用HMT 而不是HABTM?我经常处于这样一种情况,即我相信普通的 HABTM 关联可以解决我的问题(加上更轻的数据和设计),而无需使用 HMT 的时髦优势。但是关于HMT 的嗡嗡声让我怀疑我是否做出了选择HABTM 的正确决定。我怎么能确定我做出了正确的决定?
【问题讨论】:
标签:
ruby-on-rails
activerecord
associations
【解决方案1】:
有效吗?那么你做出了正确的决定。
从长远来看,如果还没有完全映射您的数据库关系,这可能不是最好的决定。但是,这不是一个会在项目的整个开发期间困扰您的决定。如果您按照指示建立 HABTM 关系,那么迁移到 HMT 关系是相当简单的。
这是需要做的事情。
- 将名为 id 的主键添加到自动递增的联接表中,并为表中已有的项目填写 id。
- 为属于关系双方的连接表创建连接模型
- 将 habtm 声明替换为 has_many :join_models 和 has_many :others, :through => :join_models
我个人更喜欢 HMT,但我的大多数连接模型需要跟踪的不仅仅是关联。
附:那篇博文已经过时了。 HMT 现在支持代理集合。
【解决方案2】:
如果您 100% 确定永远不需要向关联表添加其他字段,那么 HABTM 就可以了。如果现在不需要第三个字段,但认为有可能有一天您可能会这样做,那么您应该使用 HMT,因为您将拥有更大的灵活性。
【解决方案3】:
我认为您可能可以通过启动 HABTM 然后更改为 has_many :through 来摆脱困境——它只需要迁移重命名连接表并添加您想要的任何字段。然后,您只需创建与表对应的关联模型,它应该工作。
【解决方案4】:
只需在开始创建 HTM 关系时多花 5 分钟的时间,就可以为您以后省去很多麻烦。一旦收集了大量数据,从 HABTM 迁移到 HTM 可能不是很简单。
我肯定会建议使用 HTM 并跳过 HABTM。据我所知,没有任何情况会迫使您使用 HABTM。然而,大多数情况下,会迫使您使用 HTM(例如,向关系中添加更多数据。)