HABTM Polymorphic Relationship

前端 未结 2 1887
半阙折子戏
半阙折子戏 2020-12-01 09:13

I\'m pretty new to Rails, and i\'m trying to do a polymorphic HABTM relationship. The problem is that I have three models that I want to relate.

The first one is the

相关标签:
2条回答
  • 2020-12-01 10:01

    No, you can't do that, there's no such thing as a polymorphic has_and_belongs_to_many association.

    What you can do is create a middle model. It would probably be something like this:

    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
    

    This way the Subscription model behaves like the link table in a N:N relationship but allows you to have the polymorphic behavior to the Event.

    0 讨论(0)
  • 2020-12-01 10:03

    Resolveu parcialmente.

    It does solve the problem given the framework that we have at our disposal, but it adds "unnecessary" complexity and code. By creating an intermediary model (which I will call B), and given A -> B -> C being "A has_many B's which has_many C's", we have another AR Model which will load one more AR class implementation into memory once it is loaded, and will instantiate for the sole purpose of reaching C instances. You can always say, if you use the :through association, you don't load the B association, but then you'll be left with an even more obsolete model, which will only be there to see the caravan pass by.

    In fact, this might be a feature that is missing from Active Record. I would propose it as a feature to add, since it has been cause of concern for myself (that's how I landed in this post hoping to find a solution :) ).

    Cumprimentos

    0 讨论(0)
提交回复
热议问题