7

Mam trzy modele, z których każdy posiada następujące skojarzenia:Ustawienie: has_many: poprzez stowarzyszenia na asocjacji 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 

Jak widać w komentowanym tekście wspomniałem, czego potrzebuję .

Odpowiedz

6

Wystarczy stworzyć metodę do niego dostęp

class Model2 < ActiveRecord::Base 
    belongs_to :model1 

    def model3s 
    model1.model3s 
    end 
end 

Albo można powierzyć model1 the metoda model3s

class Model2 < ActiveRecord::Base 
    belongs_to :model1 

    delegate :model3s, :to => :model1 

end 
+0

część delegacji daje mi ten błąd "Delegacja potrzebuje celu.Dostaw skrót hasłowy z: do klucz jako ostatni argument (na przykład delegate: hello,: to =>: greeter).". Pozwól mi wypróbować metodę część – Rohit

+0

Pierwszy sposób robi dobrze i rozwiązuje mój problem. Ale proszę znaleźć usprawnienia w mechanizmie delegowania i edytować odpowiedź. : D – Rohit

+0

użyj delegate: model3s,: to =>: model1 zamiast delegata: model3s,: as =>: model1. : D działa dla mnie – Rohit

0

Dlaczego nie spróbować:

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 

ten będzie miał aktywny rekord łączy model2 i model3 przez model1_id pozostawiając model1 całkowicie poza nim i powinien być bardziej wydajny.

+1

In w ogólnym przypadku utraciłoby to wszelkie warunki związane z definicjami "has_many" w Modelu 1. na przykład jeśli Model1 został zdefiniowany za pomocą 'has_many: model2s, -> {where deleted: false}' nie wybrałbyś tych warunków bez napisania dodatkowego kodu, który byłby potencjalnie delikatny i/lub gadatliwy. Po prostu coś, o czym należy pamiętać. –