2011-07-07 10 views
1

私はsinatraとactivereord(sinatra-activerecord gemを使用して)を使ってオンラインストアを作ろうとしていますが、カテゴリ(サブカテゴリやもの)のツリーを生成する方法については頭を悩ませています。sinatraのカテゴリツリーとactiverecord?

カテゴリデータベースは単なるカテゴリ名とPARENT_IDが含まれており、次のようにactivrecordモデルは次のとおりです。

class Category < ActiveRecord::Base 
    validates_presence_of :name 
    validates_uniqueness_of :name 

    has_many :sub_categories, :class_name => 'Category', 
    :foreign_key => 'parent_id', :dependent => :destroy 
    has_many :products, :dependent => :destroy 
    belongs_to :parent_category, :class_name => 'Category' 
end 

は、どのように私は(何かが私はネストされたULタグとしてテンプレートに持つことができるということについて行くだろう私はそれが違いを作る場合hamlを使用しています)?

申し訳ありませんが、私は本当にこれらのデータ構造を使ったことはありません。

+0

'@sub = Category.find(...)。sub_categories'のようなものではなく、テンプレート内で' @sub'を繰り返して各サブカテゴリを表示します。私はActiveRecordを使用していないので、あまりよく分かりません – daddz

+0

@daddz:私はそれをやろうとしていましたが、それは有限量のサブカテゴリに制限されています。私はむしろそれを持っているので、どのように多くのカテゴリ(私は再帰的なものをしたいことを意味すると思うが、私はわからない) –

+0

それはちょうどサブカテゴリー現在選択されているカテゴリの毎回すべてのサブカテゴリを繰り返す必要があるため、カテゴリの深度が高いほど要求が長くなると思います。 – daddz

答えて

0

私はそれを理解しました。 HAMLヘルパーを使用し、current_pageが存在する場合は、currentクラスを正しい要素に適用します。ここでヘルパー

module Haml::Helpers 
    def categories_menu(parent=nil, current_page=false) 
    categories = Category.where(:parent_id => parent) 
    haml_tag :ul do 
     categories.each do |category| 
     haml_tag :li, :class => ("current" if current_page == category.id) do 
      haml_tag :a, :href => "/category/#{category.id}", :class => ("submenu" unless category.sub_categories.empty?) do 
      haml_concat(category.name) 
      end 
      unless category.sub_categories.empty? 
      categories_menu(category.id) 
      end 
     end 
     end 
    end 
    end 
end 

だと次のようにHAMLテンプレートでそれを使用します。

#test 
    - categories_menu(nil, (@category.id if defined? @category)) 

ありませんが、それは他人のアプリでうまくいく保証します。