Ruby sinatra和activerecord中的类别树?

Ruby sinatra和activerecord中的类别树?,ruby,activerecord,sinatra,Ruby,Activerecord,Sinatra,我正在尝试使用sinatra和activereord(使用sinatra activerecordgem)创建一个在线商店,但是我在想如何生成一个类别(子类别和其他东西)的“树”时遇到了一点困难 categories数据库仅包含类别名称和父项id,activrecord模型如下所示: class Category < ActiveRecord::Base validates_presence_of :name validates_uniqueness_of :name

我正在尝试使用sinatra和activereord(使用
sinatra activerecord
gem)创建一个在线商店,但是我在想如何生成一个类别(子类别和其他东西)的“树”时遇到了一点困难

categories数据库仅包含类别名称和父项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
#test
    - categories_menu(nil, (@category.id if defined? @category))
类别Category,
:foreign\u key=>'parent\u id',:dependent=>:destroy
有很多:产品,:依赖=>:销毁
属于:父类别,:类别名称=>'category'
终止
我该如何做才能在模板中作为嵌套的ul标记(如果有区别的话,我会使用haml)


很抱歉问了这么多,但我从未真正使用过这种数据结构

我明白了。它使用HAML帮助程序,如果
current\u页面
存在,它还将
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模板中使用它,如下所示:

 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
#test
    - categories_menu(nil, (@category.id if defined? @category))

不保证它能与任何其他人的应用程序一起工作。

它不应该是这样的:
@sub=Category.find(…).sub_categories
,并在模板中迭代
@sub
以显示每个子类别。我不太确定,因为我没有使用ActiveRecord@daddz:我本来打算这么做的,但那只限于有限数量的子类别。我宁愿拥有它,这样不管有多少个类别(我想这意味着我想要一种递归的东西,但我不确定),只列出当前“选定”类别的子类别不是更聪明吗?我想你的分类深度越高,请求所需的时间就越长,因为它每次都要遍历所有的子分类。有javascript手风琴类型的东西隐藏子菜单和东西。我想我可能已经找到了一个方法来做我想做的事情,尽管有一个汉密尔顿助手。。。我们看看我是怎么想出来的!只要堆栈溢出允许,我就会发布它