2012-01-28 5 views
0

lointainement Disons que j'ai trois modèles:conception de base de données ... modèles liés

class Parent < ActiveRecord::Base 
    has_many :children 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
    has_many :grandchildren 
end 

class Grandchild < ActiveRecord::Base 
    belongs_to :children 
end 

Je vais faire beaucoup de requêtes pour trouver les petits-enfants de parents. Est-il plus efficace de faire les jointures multiples, ou serait-il préférable d'ajouter une autre relation à Parent à has_many: :grandchildren et Grandchild à belongs_to :parent? Il semble que cela entraînerait une désynchronisation des modèles, bien que dans cette application particulière, les relations ne changeraient jamais une fois établies. De plus, et si nous parlions de modèles plus éloignés ... disons trois ou quatre jointures de suite? MISE À JOUR: Pour clarifier, ce que je modélise n'est pas vraiment les parents/enfants/petits-enfants. Je pensais que des noms plus génériques le rendraient plus clair, mais je peux voir comment ces noms génériques le rendaient plus confus. C'est plus comme si l'entreprise a des pièces a des commandes, et j'ai besoin de trouver les commandes liées à une entreprise. Désolé pour la confusion.

+2

Une structure récursive est probablement plus facile. – wildplasser

Répondre

0

Qu'en est-il des arrière-petits-enfants? Etc.

Vous voulez un self-join sur une classe générique "person".

En outre, il existe des choses comme acts_as_tree ou ancestry, avec une variété d'implémentations, qui rendent de telles choses triviales. Certains optimisent pour la récupération et peuvent charger une hiérarchie entière dans un seul appel.

+0

Merci, j'utilise en fait des liens personnels et des ancêtres dans d'autres endroits. J'essayais juste d'utiliser des noms génériques pour ma question. Il n'y a vraiment aucun type d'ascendance dans cette partie particulière. C'est plus comme si une entreprise produisait un produit dont les pièces avaient des commandes. Donc, je veux trouver toutes les commandes liées à une entreprise en particulier. – Brenda

+0

Le cas "éclaté de matériaux" se prête parfaitement à la structure récursive. Obtenir les bonnes contraintes peut être difficile. – wildplasser

+0

@Brenda IMO la question est trompeuse alors; YMMV. J'utiliserais directement SQL pour accéder aux commandes d'une entreprise. Ou, plus probablement, je créerais soit une table auxiliaire pour raccourcir les commandes de l'entreprise, soit donner des ordres à une entreprise. –