2016-04-16 24 views
0

Ich habe Probleme mit Assoziationen. Im Grunde haben Benutzer Gruppen (nicht mit jemandem geteilt). Jede Gruppe hat Kunden, Projekte und Aufgaben.Mehrere verschachtelte Assoziationsverknüpfungen

Soll ich definieren so etwas wie:

class User < ActiveRecord::Base 
    has_many :groups 
    has_many :clients, through: :groups 
    has_many :projects, through :clients #(could be groups?) 
    has_many :task, through :groups 
end 

ist dies der richtige Weg, es zu tun? Ich möchte nur von jedem Benutzer alle ihre Aufgaben, Gruppen und Kunden auflisten. Ist es in Ordnung, so durch die Modelle zu "reisen"? Ich habe einige RoR Tutorials und Bücher verfolgt, aber alle von ihnen befassen sich mit weniger Modellen.

basic rough model

Antwort

1

Sie können durch navigieren wie Sie wollen. Here wird der Fall erläutert, wenn Sie eine Verknüpfung über verschachtelte has_many Assoziationen (suchen Sie ein wenig unter dem Link, den ich gepostet).

So diese Erklärung gegeben, dafür zu arbeiten, was Sie tun müssen, um die folgenden (Sie es in der Nähe waren):

class User < ActiveRecord::Base 
    has_many :groups 
    has_many :clients, through: :groups 
    has_many :projects, through :groups 
    has_many :tasks, through :groups 
end 

class Group < ActiveRecord::Base 
    belongs_to :user 

    has_many :clients 
    has_many :projects, through :clients 
    has_many :tasks, through :clients 
end 

class Client < ActiveRecord::Base 
    belongs_to :group 

    has_many :projects 
    has_many :tasks, through :projects 
end 

class Project < ActiveRecord::Base 
    belongs_to :client 

    has_many :tasks 
end 

class Task < ActiveRecord::Base 
    belongs_to :project 
end 

Eine andere Möglichkeit (und vielleicht kürzer) sein würde einzurichten (aussehen here wo beide Strategien dokumentiert sind):

class User < ActiveRecord::Base 
    has_many :groups 
    has_many :clients, through: :groups 
    has_many :projects, through :clients 
    has_many :tasks, through :projects 
end 

class Group < ActiveRecord::Base 
    belongs_to :user 

    has_many :clients 
end 

class Client < ActiveRecord::Base 
    belongs_to :group 

    has_many :projects 
end 

class Project < ActiveRecord::Base 
    belongs_to :client 

    has_many :tasks 
end 

class Task < ActiveRecord::Base 
    belongs_to :project 
end 

Hoffe es hilft!

+0

Danke !, das war was ich wollte. Ich hatte nur Angst, dass es nicht der richtige Weg war. Ich schätze Ihre Antwort: D – Gaston

+0

@Gaston sicher, np! Wenn Sie zufrieden sind und Sie denken, dass es die richtige Antwort ist, markieren Sie sie bitte als die richtige Antwort :) –