2 votes

Comment fonctionne le Nested Set Gem et comment puis-je l'intégrer dans mon projet ?

On m'a récemment conseillé d'utiliser, pour les relations de mon application rails actuelle, la gemme ensemble imbriqué . ( Ma précédente discussion / question ici ) J'ai actuellement 3 modèles,

Catégories a beaucoup de sous-catégories
Les sous-catégories appartiennent aux catégories et ont de nombreux produits.
Le produit appartient à la sous-catégorie. Je voulais l'afficher comme suit

+Catégorie
----Sous-catégorie
--------Produit
--------Produit
----Sous-catégorie
--------Produit
--------Produit

+Catégorie
----Sous-catégorie
--------Produit
--------Produit

Si je devais faire cela dans nested_set, comment le configurer dans mes modèles ? Est-ce que je supprimerais mes modèles de sous-catégorie et de produit, et j'ajouterais simplement acts_as_nested_set dans le modèle de catégorie ? et une fois que j'ai le modèle en place, avec quoi vais-je mettre à jour les actions de mes contrôleurs, pour pouvoir créer des noeuds dans l'ensemble imbriqué que j'ai créé ?

Je pense qu'il faut juste m'aider à comprendre comment je peux faire le CRUD, la création, la lecture, la mise à jour et la destruction de cette liste nested_set.

Voici un peu de code que j'ai déjà

Catégories Contrôleur :

class CategoriesController < ApplicationController
def new
  @category = Category.new
  @count = Category.count
end

def create
@category = Category.new(params[:category])
if @category.save
  redirect_to products_path, :notice => "Category created! Woo Hoo!"
else
  render "new"
end
end

def edit
  @category = Category.find(params[:id]) 
end

def destroy
  @category = Category.find(params[:id])
  @category.destroy
  flash[:notice] = "Category has been obliterated!"
  redirect_to products_path
end

def update
  @category = Category.find(params[:id])

if @category.update_attributes(params[:category])
  flash[:notice] = "Changed it for ya!"
  redirect_to products_path
else 
  flash[:alert] = "Category has not been updated."
  render :action => "edit"
end
end

def show
  @category = Category.find(params[:id])
end

def index
  @categories = Category.all
end 
end

Catégorie Modèle :

class Category < ActiveRecord::Base
  acts_as_nested_set
  has_many :subcategories
  validates_uniqueness_of :position
  scope :position, order("position asc")

end

Modèle de sous-catégorie :

class Subcategory < ActiveRecord::Base
  belongs_to :category
  has_many :products
  scope :position, order("position asc")
end

Enfin, le modèle de produit :

class Product < ActiveRecord::Base
  belongs_to :subcategory
  has_many :products
  scope :position, order("position asc")
end

Toute aide serait très appréciée.

2voto

Chris Drappier Points 1840

J'opterais pour une catégorie et un produit comme suit :

class Product > ActiveRecord::Base
  belongs_to :category
end

class Category > ActiveRecord::Base
  has_many :products
  acts_as_nested_set
end

class CategoryController < ApplicationController
   def create

      @category = params[:id] ? Category.find(params[:id]).children.new(params[:category]) : Category.new(params[:category])

      if @category.save
          redirect_to products_path, :notice => "Category created! Woo Hoo!"
      else
          render "new" 
      end
   end

   def new
      @category = params[:id] ? Category.find(params[:id]).children.new : Category.new
   end

   def index
      @categories = params[:id] ? Category.find(params[:id]).children : Category.all
   end
end

#config/routes.rb your categories resource could be something like..
resources :categories do
   resources :children, :controller => :categories, 
                              :only => [:index, :new, :create]
end

Cette méthode est la plus souple, car vous pouvez classer vos produits dans n'importe quelle catégorie, à n'importe quel niveau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X