25

我是Rails的新手,我试图做一个多态HABTM关系。问题是我有三个我想要涉及的模型。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. 它会起作用吗?

回答

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的关系,但可以让你拥有多态行为的事件。

0

Resolveu parcialmente。

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

事实上,这可能是Active Record中缺少的功能。我建议将它作为一个补充功能,因为它一直是我自己关注的原因(这就是我如何登陆这篇文章希望找到解决方案:))。

Cumprimentos