2010-04-06 4 views
1

Je voudrais une association has_many qui fonctionne comme ceci:Ruby sur les associations Rails pour la théorie des ensembles (union, différence, intersection, etc.)

class Hood 
    acts_as_tree 
    has_many :houses, :union_with => :parent 
end 

class House 
end 

où une maison associée à capuchon 1 serait également retourné dans .houses des subhoods de Hood 1, avec les associations individuelles des subhoods.

L'association n'a besoin de fonctionner que du point de vue du capot.

J'ai écrit une macro union_with_parent qui a donné l'effet désiré, mais beaucoup d'effets secondaires regrettables. Un problème majeur était que has_many :dependent => :destroy a entraîné des suppressions imprévues; la suppression d'un subhood a également causé la suppression de toutes les maisons dans le parent Hood, puisque je viens de redéfinir la méthode houses.

Problème similaire avec une macro de différence d'ensemble, sauf qu'aucune des maisons du sous-sol n'a été détruite. (Pensez à ceci comme un masque.) Alors un sous-règne contiendrait toutes les maisons dans le parent, sauf celles qui sont dans la base de données comme appartenant à la sous-unité. Le comportement que je voudrais: seul le contenu du masque est détruit.)

J'ai pensé à écrire une macro has_many_union, mais il semble que toutes les associations sont assez impliquées .

Est-ce que je fais ça bêtement? Y a-t-il un moyen plus facile? Ou devrais-je redéfinir radicalement? (Je préférerais ne pas re-concevoir, car le transfert des données n'est pas idéal.)

(Pour le compte rendu, oui, je sais que cette métaphore est nulle. Peut-être que vous connaissez tous une meilleure façon d'obtenir l'effet désiré?

Répondre

1

Vous ne voulez pas mélanger des choses comme :dependent => :destroy avec des recherches compliquées. Vous pouvez garder votre code pour .houses, mais ajoutez simple association has_many pour gérer la destruction:

has_many :exclusive_houses, :class_name => 'House', :dependent => 'destroy' 

puis construire .houses sur .exclusive_houses et parent.houses, ou autre chose. Ceci détruira seulement les maisons avec hood_id de l'identifiant de la capote détruite.

Aussi, juste pour que vous le sachiez, votre exemple n'a pas vraiment de sens avec la théorie des ensembles. Les éléments d'un ensemble sont inclus dans son surensemble, et non ses sous-ensembles. Si vous avez réellement une structure de sets imbriquée, il pourrait y avoir de meilleures architectures pour cela que des arbres.

+0

Excuses, vous avez raison. Cela aurait dû être un super-héros. =) –

Questions connexes