HABTM多态关系

时间:2011-08-06 04:06:13

标签: ruby-on-rails-3 activerecord polymorphism relationship has-many-polymorphs

我对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
  1. HABTM表迁移需要如何?我有点困惑,我没有找到任何帮助。
  2. 它会起作用吗?

2 个答案:

答案 0 :(得分:61)

不,你不能这样做,没有多态的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关系中的链接表,但允许您对事件具有多态行为。

答案 1 :(得分:0)

Resolveu parcialmente。

它确实解决了我们可以使用的框架所带来的问题,但它增加了“不必要的”复杂性和代码。通过创建一个中间模型(我将称之为B),并给出A - &gt; B - &gt; C是“A has_many B的has_many C”,我们有另一个AR模型,它将在加载后再加载一个AR类实现到内存中,并且实例化的唯一目的是到达C实例。你总是可以说,如果你使用:through关联,你不会加载B关联,但是你会留下一个更加过时的模型,只有在那里看到大篷车经过。

实际上,这可能是Active Record中缺少的一项功能。我建议将其添加为一个功能,因为它引起了我自己的关注(这就是我希望找到解决方案的帖子:))。

Cumprimentos