Как работает Nested Set Gem и как я могу включить его в свой проект? - PullRequest
2 голосов
/ 17 февраля 2012

Мне недавно сообщили, что для моих текущих отношений с rails app я должен использовать вложенный набор gem .(Моя предыдущая тема / вопрос здесь ) В настоящее время у меня есть 3 модели,

Категории has_many Подкатегории
Подкатегории принадлежат_Категориям и продуктам has_many.
Товар принадлежит к подкатегории.Я хотел показать что-то вроде этого

+ Категория
---- Подкатегория
-------- Продукт
-------- Продукт
---- Подкатегория
-------- Продукт
-------- Продукт

+ Категория
---- Подкатегория
-------- Product
-------- Product

Итак, если бы я сделал это в nested_set, как бы я настроил это в своих моделях?Буду ли я удалять свою подкатегорию и модели продуктов и просто добавлять act_as_nested_set в модели категорий?и как только я позабочусь о модели, с помощью чего я буду обновлять свои действия контроллеров, чтобы иметь возможность создавать узлы во вложенном наборе, который я создаю?

Я думаю, просто помогите мне понять, как я могу сделать CRUD, создавать, читать, обновлять и уничтожать этот список nested_set.

Вот некоторый код, который у меня уже есть

Контроллер категорий:

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

Категория Модель:

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

end

Модель подкатегории:

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

И, наконец, модель продукта:

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

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 17 февраля 2012

Я бы выбрал категорию и продукт следующим образом:

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

. Этот способ наиболее гибкий, поскольку вы можете поместить свою продукцию в любую категорию на любом уровне.

...