7

He tres modelos, cada uno con las siguientes asociaciones:El establecimiento de un: has_many: a través de la asociación en una asociación belongs_to Ruby on Rails

class Model1 < ActiveRecord::Base 
    has_many :model2s 
    has_many :model3s 
end 

class Model2 < ActiveRecord::Base 
    belongs_to :model1 
    has_many :model3s, :through => :model1 # will this work? is there any way around this? 
end 

class Model3 < ActiveRecord::Base 
    belongs_to :model1 
    has_many :model2s, :through => :model1 # will this work? is there any way around this? 
end 

Como se puede ver en el texto comentado, he mencionado lo que necesito .

Respuesta

6

Usted acaba de crear el método para acceder a ella

class Model2 < ActiveRecord::Base 
    belongs_to :model1 

    def model3s 
    model1.model3s 
    end 
end 

O bien, puede delegar en Model1 el método model3s

class Model2 < ActiveRecord::Base 
    belongs_to :model1 

    delegate :model3s, :to => :model1 

end 
+0

la parte de la delegación me da este error "La delegación necesita un objetivo. Proporcione un hash de opciones con un: a como el último argumento (por ejemplo, delegar: hola,: a =>: bienvenida)". Déjame probar el método parte – Rohit

+0

La primera forma es hacerlo bien y resuelve mi problema. Pero encuentre algunos ajustes en el mecanismo de delegación y edite la respuesta. : D – Rohit

+0

use delegate: model3s,: to =>: model1 en lugar de delegate: model3s,: as =>: model1. : D funciona para mí – Rohit

0

Por qué no pruebas:

class Model1 < ActiveRecord::Base 
    has_many :model2s 
    has_many :model3s 
end 

class Model2 < ActiveRecord::Base 
belongs_to :model1 
has_many :model3s, :primary_key => :model1_id, 
         :foreign_key => :model1_id 

end 

class Model3 < ActiveRecord::Base 
    belongs_to :model1 
    has_many :model2s, :primary_key => :model1_id, 
         :foreign_key => :model1_id 
end 

Esto tendrá active record join model2 y model3 por model1_id dejando model1 completamente fuera de ella y debería ser más eficiente.

+1

In el caso general esto perdería las condiciones asociadas a las definiciones "has_many" en Model1. p.ej. si Model1 se definió con 'has_many: model2s, -> {where deleted: false}', no elegiría esas condiciones sin escribir algún código adicional que fuera potencialmente frágil y/o detallado. Solo algo de lo que debes estar consciente. –

Cuestiones relacionadas