2011-03-14 11 views
36

Tengo un modelo PointOfContact que has_manySystems. Desde el lado Systems, quiero identificar el PointOfContact como technical_manager o project_manager (o ambos). Mientras que solo mantuve el PointOfContact 1 vez en la base de datos.Mismo modelo para dos belongs_to Asociaciones

Mi intento de la siguiente manera:

class System < ActiveRecord::Base 
    belongs_to :project_manager, :class_name => 'PointOfContact' 
    belongs_to :technical_manager, :class_name => 'PointOfContact' 
end 

class PointOfContact < ActiveRecord::Base 
    has_many :systems 
end 

Cuando ejecuto mi especificaciones (continuación este ejemplo) que puede crear correctamente el punto de contacto System asociaciones. Sin embargo, el PointOfContact no tiene conocimiento de su asociación con el sistema. ¿Porqué es eso?

@sys = System.create 
@tm = PointOfContact.create 
@pm = PointOfContact.create 

@sys.project_manager = @pm 
@sys.technical_manager = @tm 

@pm.systems.should have(1).items #> expected 1 items, got 0 

Respuesta

62

Gracias a jamesw encima en RailsForum.com: Same Model for Two belongs_to Associations una solución ha sido encontrada.

class System < ActiveRecord::Base 
    belongs_to :project_manager, :class_name => 'PointOfContact', :foreign_key => 'project_manager_id' 
    belongs_to :technical_manager, :class_name => 'PointOfContact', :foreign_key => 'technical_manager_id' 
end 

class PointOfContact < ActiveRecord::Base 
    has_many :project_managed_systems, :class_name => 'System', :foreign_key => 'project_manager_id' 
    has_many :technical_managed_systems, :class_name => 'System', :foreign_key => 'technical_manager_id' 
end 
+0

más detalles sobre: ​​through relationships on [link] (http://railscasts.com/episodes/163-self-referential-association?view=asciicast) – Zippie

Cuestiones relacionadas