Comment implémenter dans les rails une catégorie pouvant être enfant d'une autre catégorie (auto-référentiel has_one)?Catégorie enfant d'une autre catégorie dans les rails
Merci
Comment implémenter dans les rails une catégorie pouvant être enfant d'une autre catégorie (auto-référentiel has_one)?Catégorie enfant d'une autre catégorie dans les rails
Merci
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!
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 + "\'")}'
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! –
Merci, cela a plutôt bien fonctionné. J'étais un peu confus sur cette association et ta réponse a tout clarifié :) Merci. –