2009-08-05 7 views
0

Ich habe 3 Klassen von habtm Assoziationen verwandt ... Benutzer, Standorte, Mitarbeiter.Rails: Kinder von Kindern in habtm activerecord Beziehungen zu finden

Benutzer sind mit Standorten über eine Beziehung verwandt, und Standorte sind mit Mitarbeitern über eine Beziehung verwandt.

Was würde ich tun, um die Lage sein mag, ist, sagen:

current_user.locations.employees

Kennt jemand den „Rails Way“, dies zu tun? Ich kann es in SQL machen, aber ich frage mich, ob es einen saubereren Weg gibt.

+0

Ich glaube nicht, dass es für unsere Kinder, Kinder zu sein geeignet ist. Sie würden mit dieser Art von russischen Puppe Situation enden. – Sean

Antwort

1

Sie können Verbände in Active erweitern:

class User 

    has_many :locations do 

    def employees 
     # Use whatever logic you'd like here. 
     locations.find(:all, :include => [:employees]).collect {|l| l.employees } 
    end 

    end 

end 

u = User.find 1 
u.locations.employees #=> calls our method defined above 

Und sehen:

http://ryandaigle.com/articles/2006/12/3/extend-your-activerecord-association-methods

Sie auch has_many :through versuchen können:

class User 

    has_many :user_locations 
    has_many :locations, :through => :user_locations 


    # Not sure if you can nest this far, this guy has problems with it: 
    # http://tim.theenchanter.com/2008/10/how-to-hasmany-through-hasmany-through.html 
    # 
    # Maybe if locations was a habtm instead of :through? experiment with it! 
    # 
    has_many :employees, :through => :locations 

end 

u = User.find 1 
u.employees #=> Uses associations to figure out the SQL 

Im Allgemeinen Lee, ich bin besorgt über Ihr Datenmodell. HABTM-Beziehungen werden jetzt nicht wirklich empfohlen. Mithilfe von has_many :through können Sie die Join-Tabelle benennen und anschließend Attribute für eine Beziehung mit besserer Geschäftsbedeutung speichern. Ich würde sagen, die "Raily" -Ding ist, einige durch Beziehungen hinzufügen, um mehr Domain-Modellierung zu offenbaren.

Auch einige Beispielmodelle wären hilfreich, um Ihre Frage wirklich zu verstehen.

Viel Glück!

0

Ich nehme an, dass das Folgende wahr ist und dass Ihre ActiveRecords dies widerspiegeln wird.

user belongs_to location 
location has_many users 
location has_many employees 
employee belongs_to location 

dann können Sie in Ihrem Benutzer sagen Active

has_many :employees :through => :locations 

Ich denke, dass sollte funktionieren.

UPDATE:

gerade realisiert, dass Ihre Benutzer auch viele Standorte hat. Nicht ganz sicher, ob das Obige funktioniert oder nicht. Einen Versuch wert.

0

Sie könnten Methode in Benutzer Art wie die folgenden

def get_all_related_employees 
    employees = [] 
    self.locations.each do |location| 
     employees << location.employees 
    end 
    employees 
end 

definieren oder Sie es

direkt inline tun konnten
current_user.locations.map {|location| location.employees }.each do |employee| 
    puts employee.name 
end 
Verwandte Themen