HABTM 多态关系

Posted

技术标签:

【中文标题】HABTM 多态关系【英文标题】:HABTM Polymorphic Relationship 【发布时间】:2011-10-21 08:04:26 【问题描述】:

我对 Rails 很陌生,我正在尝试建立多态 HABTM 关系。问题是我要关联三个模型。

第一个是事件模型,然后是两种参与者:用户和联系人。

我想做的是能够以与会者的身份将用户和联系人联系起来。所以,我现在在我的代码中拥有的是:

事件模型

has_and_belongs_to_many :attendees, :polymorphic => true

用户模型

has_and_belongs_to_many :events, :as => :attendees

联系模特

has_and_belongs_to_may :events, :as => :attendees
    HABTM 表迁移需要如何进行?我有点困惑,我没有找到任何帮助。 它会起作用吗?

【问题讨论】:

【参考方案1】:

不,你不能那样做,不存在多态 has_and_belongs_to_many 关联。

您可以做的是创建一个中间模型。大概是这样的:

class Subscription < ActiveRecord::Base
  belongs_to :attendee, :polymorphic => true
  belongs_to :event
end

class Event < ActiveRecord::Base
  has_many :subscriptions
end

class User < ActiveRecord::Base
  has_many :subscriptions, :as => :attendee
  has_many :events, :through => :subscriptions
end

class Contact < ActiveRecord::Base
  has_many :subscriptions, :as => :attendee
  has_many :events, :through => :subscriptions
end

这样,订阅模型的行为类似于 N:N 关系中的链接表,但允许您对事件具有多态行为。

【讨论】:

有人可以对此进行扩展吗?如何设置迁移?如何建立关系? 迁移只需要解决多态的belongs_to关系。 rails 文档涵盖了这一点,如果您需要它,很高兴为您提供帮助。关系就在那里——不确定你在问什么。有很多通过连接habtm关系中的对象。 这可能在此期间发生了变化?看起来 Rails 现在支持 has_and_belongs_to_many 没有中间表:guides.rubyonrails.org/…【参考方案2】:

Resolveu parcialmente。

考虑到我们可以使用的框架,它确实解决了问题,但它增加了“不必要的”复杂性和代码。通过创建一个中间模型(我将其称为 B),并假设 A -> B -> C 是“A has_many B's which has_many C's”,我们有另一个 AR 模型,它将在内存中加载另一个 AR 类实现加载,并将实例化仅用于到达 C 实例。你总是可以说,如果你使用 :through 关联,你不会加载 B 关联,但是你会得到一个更过时的模型,它只会在那里看到商队经过。

事实上,这可能是 Active Record 中缺少的功能。我建议将其作为一项添加功能,因为它一直引起我自己的关注(这就是我在这篇文章中希望找到解决方案的方式:))。

吃喝玩乐

【讨论】:

以上是关于HABTM 多态关系的主要内容,如果未能解决你的问题,请参考以下文章

使用 HABTM 关系保存帖子标签

优化 MySQL 连接表查询(HABTM 对象关系)

cakephp 在不使用视图的情况下保存 HABTM 关系的数据

Cakephp habtm 关系更新而不是保存

在保存具有 HABTM 关系的帖子之前自动插入标签

Rails,Ransack:如何在 HABTM 关系中搜索“所有”匹配项而不是“任何”匹配项