2010-11-17 5 views
2

Ma configuration est la suivante:: relation has_many avec: par une autre relation avec: par

class User < ActiveRecord::Base 
    has_many :owners, :dependent => :destroy 
    has_many :properties, :through => :owners 
end 

class Owner < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :property 
end 

class Property < ActiveRecord::Base 
    has_many :owners, :dependent => :destroy 
    has_many :users, :through => :owners 
    has_many :datafiles, :dependent => :destroy 
end 

class Datafile < ActiveRecord::Base 
    belongs_to :property 
end 

Maintenant, je voudrais être en mesure de faire @ user.datafiles. J'ai essayé has_many :datafiles, :through => :properties, :source => :datafiles mais il semble y avoir un problème avec un: à travers quelque chose qui est déjà allé à un: à travers. Alors, comment pourrais-je essayer de gérer ce que j'essaie de faire ici?

Merci d'avance.

Répondre

0

Que diriez-vous quelque chose comme:

#user.rb 

def datafiles 
    Property.find(:all, :joins => :owners, :conditions => ['owners.user_id = self.id'], :include => :datafile).collect(&:datafile) 
+0

Cela ne fonctionne pas. Le problème est que les propriétés n'ont pas de user_id car une propriété peut avoir plusieurs utilisateurs. C'est à ça que sert la table des propriétaires. Propriété has_many: users,: through =>: owners –

+0

Désolé, trop tôt pour la concentration. :) Que diriez-vous de l'édition? – mark

1

2 approches;

1>

class User < AR 
    has_many :owners, :dependent => :destroy 
    has_many :properties, :through => :owners 
    has_many datafiles 
end 

class Datafile < AR 
    belongs_to :user 
    belongs_to :property 
end 

Votre exigence de user.datafiles doit être remplie avec cela.

Si vous voulez un has_many imbriqué, vous devrez utiliser un plugin qui est la 2ème approche. Vous pouvez le trouver here. Le plugin fonctionne hors de la boîte et fait le travail.

Questions connexes