Ruby sinatra和activerecord中的类别树?
我正在尝试使用sinatra和activereord(使用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 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手风琴类型的东西隐藏子菜单和东西。我想我可能已经找到了一个方法来做我想做的事情,尽管有一个汉密尔顿助手。。。我们看看我是怎么想出来的!只要堆栈溢出允许,我就会发布它