2

私は最近、私の現在のレールアプリの関係のために、宝石nested setを使うべきだとアドバイスされました。 (私の前のスレッド/質問here)私は現在3つのモデル、カテゴリー、およびhas_manyの製品BELONGS_TO
サブカテゴリを、サブカテゴリにhas_manyNested Set Gemはどのように機能し、どのようにプロジェクトに組み込むことができますか?

カテゴリーを持っています。
製品belongs_toサブカテゴリ。私はサブカテゴリ ----この

+カテゴリー
のようなもの----サブカテゴリ
--------製品
--------製品
それを表示したいです
--------製品
--------製品

+カテゴリー
----サブカテゴリ
--------製品
--- -----製品

これをnested_setで行う場合は、モデルでどのように設定するのですか?サブカテゴリと製品モデルを削除し、categories_as_nested_setをCategoryモデルに追加するだけですか?モデルを作成したら、作成したネストされたセットのノードを作成できるように、コントローラのアクションを更新するものは何ですか?

私は、このnested_setリストのCRUD、作成、読み取り、更新、および破棄をどのように行うことができるかを理解するのに役立つと思います。

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 

ご協力いただければ幸いです。

答えて

2

私はそうのようなカテゴリーと製品となるだろう:

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 

この方法は、あなたが任意のレベルで任意のカテゴリで貴社の製品を置くことができるよう、最も柔軟性があります。

+0

いいですね。私のモデルにacts_as_nested_setを適用すると、正確に何が起こっていますか?私の新しい/作成するアクションはまだ同じに見えますか?私はコントローラーでそれをどうやって行うのかがはっきりしていません。 – ruevaughn

+0

コントローラのロジックを使って答えを更新しました。ここでの要点は、ルートを追加する必要があるということです。各コントローラのアクションでは、params [:id]が存在するかどうかによって異なる方法で処理します。 –

+0

これを実装しようとしています。私のCategoriesコントローラで指定したコード 'undefined method parent_id_changed? for# 'のように、カテゴリを作成しようとしました。このエラーメッセージは何ですか? – ruevaughn