2010-10-24 6 views

Répondre

3

d'abord, je crois que vous voulez une relation has_many, pas has_one. Je ne peux pas imaginer une situation où vous voudriez que les catégories aient à la plupart des catégories de un enfant. La réponse précédente vous donne aussi une seule direction - les catégories connaissent leurs parents, mais pas leurs enfants.

La solution complète est assez simple. Le tableau des catégories devrait avoir une colonne de category_id, et le modèle devrait ressembler à ceci:

class Category < ActiveRecord::Base 
    belongs_to :category 
    has_many :categories 
end 

Si vous voulez aller plus loin et les appeler les parents et les enfants, vous pouvez:

class Category < ActiveRecord::Base 
    belongs_to :parent, :class_name => 'Category', :foreign_key => 'category_id' 
    has_many :children, :class_name => 'Category', :foreign_key => 'category_id' 
end 

Bonne chance avec votre application!

+0

Merci, cela a plutôt bien fonctionné. J'étais un peu confus sur cette association et ta réponse a tout clarifié :) Merci. –

0

L'approche simple consiste à utiliser une clé étrangère de category_id comme d'autres l'ont déjà indiqué. Cependant, si vous parlez d'imbriquer beaucoup de catégories, cela peut être assez inefficace. (Note: Poster plus de vos besoins serait utile.)

J'aime vraiment, vraiment le ancestry gem. Voici un extrait pertinent des docs (emphase mienne).

Comme on peut le voir dans la section précédente , Ancestry stocke un chemin de la racine au parent pour chaque nœud. Il s'agit d'une variante du modèle de base de données de chemin matérialisé . Il permet Ancestry récupérer de relation (frères et sœurs, descendants, etc.) sans les algorithmes complexes et incompréhensibilité associés à valeurs de gauche et de droite dans une requête SQL unique . De plus, les insertions, suppressions et mises à jour seulement affectent les nœuds dans le sous-arbre du nœud affecté .

Et, voici un bonus gratuit, juste parce que ce n'est pas immédiatement évident. Si vous devez traiter les frères et sœurs comme une liste avec des positions, vous pouvez les définir comme suit.

acts_as_list :scope => 'ancestry #{(ancestry.blank? ? "IS NULL" : "=\'" + ancestry + "\'")}' 
+0

Merci jdl, je vais regarder sur cela mais en fait j'ai une exigence assez simple de faire la catégorie et la sous-catégorie d'un système simple de produits. Je garderai à l'esprit cette gemme quand j'ai besoin de structures plus compliquées comme vous l'avez dit :) merci de me l'indiquer! –

Questions connexes