ruby on rails - HABTM relationships with polymorphism -


  • i've got person can linked many structures (structure polymorphic)
  • i've got venue, can have many people, structure.
  • i've got journal, can have many people, structure.

here modelization :

class venue < activerecord::base   has_many :structure_people, :as => :structure   has_many :people, :through => :structure_people end  class journal < activerecord::base   has_many :structure_people, :as => :structure   has_many :people, :through => :structure_people end  class person < activerecord::base   has_many :structure_people   has_many :structures, :through => :structure_people end  class structureperson < activerecord::base   belongs_to :structure, polymorphic: true   belongs_to :person end 

my problem :

  • when try people on venue or on journal, works. cool :)

but

  • when try structures on person, i've got error :

    activerecord::hasmanythroughassociationpolymorphicsourceerror: cannot have has_many :through association 'person#structures' on polymorphic object 'structure#structure'.

anyone me solve ?

thanks lot.

christophe

i think it's restriction of rails, because has_many association guess class_name automatically. polymorphic association may returns multiple class_name. mind use this:

class person < activerecord::base   has_many :structure_people   has_many :venues, :through => :structure_people   #journal same. end  class structureperson < activerecord::base   belongs_to :structure, polymorphic: true   belongs_to :venue, :foreign_key => 'structure_id', :conditions => {:structure_type => 'venue'}   belongs_to :person end 

although ugly solution...

i think can choose alternative way.

class person < activerecord::base   has_many :structure_people    def structures     structure_people.map(&:structure)   end end 

you can't chaining function of has_many, can polymorphic structures :)


Comments

Popular posts from this blog

java - Run a .jar on Heroku -

java - Jtable duplicate Rows -

validation - How to pass paramaters like unix into windows batch file -