7

J'ai trois modèles, chacun ayant les associations suivantes:Définition d'un: has_many: par l'association sur une association 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 

Comme vous pouvez le voir dans le texte commenté, je l'ai dit ce que je dois .

Répondre

6

Vous venez de créer la méthode pour y accéder

class Model2 < ActiveRecord::Base 
    belongs_to :model1 

    def model3s 
    model1.model3s 
    end 
end 

Ou, vous pouvez déléguer à Model1 la méthode model3s

class Model2 < ActiveRecord::Base 
    belongs_to :model1 

    delegate :model3s, :to => :model1 

end 
+0

La partie de délégation me donne cette erreur "La délégation a besoin d'une cible Fournissez un hachage d'options avec une clé: à comme dernier argument (par exemple délégué: bonjour,: à =>: greeter).". Laissez-moi essayer la partie de la méthode – Rohit

+0

La première façon est de bien faire et résout mon problème. Mais s'il vous plaît trouvez quelques ajustements dans le mécanisme de délégation et éditez la réponse. : D – Rohit

+0

use delegate: model3s,: to =>: model1 au lieu de delegate: model3s,: as =>: model1. : D travaille pour moi – Rohit

0

Pourquoi ne pas essayer:

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 

Cela aura l'enregistrement actif rejoint model2 et model3 par model1_id laissant model1 complètement hors de lui et devrait être plus efficace.

+1

Dans le cas général cela perdrait toutes les conditions attachées aux définitions "has_many" dans Model1. par exemple. si Model1 a été défini avec 'has_many: model2s, -> {where deleted: false}' vous ne choisiriez pas ces conditions sans écrire du code supplémentaire qui était potentiellement fragile et/ou verbeux. Juste quelque chose à savoir. –

Questions connexes