我对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
答案 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