7

ho tre modelli, ciascuno con le seguenti associazioni:L'impostazione di una: has_many: attraverso l'associazione in un'associazione 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 

Come si può vedere nel testo commentato, ho già detto quello che mi serve .

risposta

6

basta creare il metodo per accedervi

class Model2 < ActiveRecord::Base 
    belongs_to :model1 

    def model3s 
    model1.model3s 
    end 
end 

In alternativa, è possibile delegare alla model1 il metodo model3s

class Model2 < ActiveRecord::Base 
    belongs_to :model1 

    delegate :model3s, :to => :model1 

end 
+0

la parte di delega mi dà questo errore "La delega ha bisogno di un obiettivo Fornire un hash di opzioni con a: to key come ultimo argomento (ad esempio delegato: ciao,: to =>: greeter).". Lasciatemi provare il metodo parte – Rohit

+0

Il primo modo è fare del bene e risolvere il mio problema. Ma si prega di trovare alcune modifiche nel meccanismo di delega e modificare la risposta. : D – Rohit

+0

utilizza delegato: model3s,: to =>: model1 invece di delegato: model3s,: as =>: model1. : D funziona per me – Rohit

0

Perché non provi:

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 

Ciò avrà record attivo unisce model2 e model3 by model1_id lasciando completamente fuori da model1 e dovrebbe essere più efficiente.

+1

In nel caso generale ciò perderebbe qualsiasi condizione associata alle definizioni "has_many" in Model1. per esempio. se Model1 è stato definito con 'has_many: model2s, -> {where deleted: false}' non sceglieresti queste condizioni senza scrivere un codice extra che fosse potenzialmente fragile e/o prolisso. Solo qualcosa di cui essere a conoscenza. –

Problemi correlati