如果不使用任何宝石,我如何在rails中执行此操作?
主要类别
子类别
子类别
子类别
主要类别
子类别
子类别
子类别
主要类别
子类别
子类别
子类别
我有一个由|组成的表id | level1 | level2 |
1级是主要类别,2级是子类别
我希望它显示在上面的视图中。
在网上浏览后,每个人似乎都建议使用类似行为的宝石,但是我想避免使用它们,因为我对rails很新,我想了解如何做而不是转向宝石。
你的帮助很难实现
型号:
class Category < ActiveRecord::Base
belongs_to :catalogue
has_many :subcategories, :class_name => "Category", :foreign_key => "parent_id", :dependent => :destroy
belongs_to :parent_category, :class_name => "Category"
end
控制器:
class CataloguesController < ApplicationController
layout 'main'
def index
@cats = Catalogue.all
end
def categories
@cat = Catalogue.find(params[:id])
end
end
查看:
<ul class="unstyled-list">
<% @cat.categories.order([:level1]).each do |cat|%>
<li><%= cat.level1 %></li>
<li><%= cat.level2 %></li>
<% end %>
</ul>
答案 0 :(得分:51)
创建一个对子类别(或子子类别等)引用自身的模型:
class Category < ActiveRecord::Base
has_many :subcategories, :class_name => "Category", :foreign_key => "parent_id", :dependent => :destroy
belongs_to :parent_category, :class_name => "Category"
end
has_many
定义了模型类型subcategories
的{{1}}关联。即它使用相同的表格。Category
定义回到父类别的关系(可选,不是必需的)有关模型关联的更多信息,belongs_to
或has_many
,请阅读Associations Basics Guide。
要创建表,请使用此迁移:
belongs_to
注意:这个表格格式(稍微)与你提出的不同,但我认为这不是一个真正的问题。
Migrations Guide包含有关数据库迁移的更多信息。
在您的控制器中使用
class CreateCategories < ActiveRecord::Migration
def self.up
create_table :category do |t|
t.string :text
t.references :parent
t.timestamps
end
end
end
查找没有父母的所有类别,即主要类别
要查找任何给定类别的所有子类别,请使用:
def index
@category = nil
@categories = Category.find(:all, :conditions => {:parent_id => nil } )
end
要添加新类别,请使用:
# Show subcategory
def show
# Find the category belonging to the given id
@category = Category.find(params[:id])
# Grab all sub-categories
@categories = @category.subcategories
# We want to reuse the index renderer:
render :action => :index
end
它创建一个新类别并设置父类(如果已提供)(否则它将成为主类别)
注意:我使用旧的rails语法(由于懒惰),但对于Rails 3.2,原理是相同的。
在def new
@category = Category.new
@category.parent = Category.find(params[:id]) unless params[:id].nil?
end
中,您可以使用以下内容:
categories/index.html.erb
它显示所选类别(或主类别)的名称及其所有子类别(在一个漂亮的表中)。它链接到所有子类别,显示类似的布局,但是对于子类别。最后,它添加了一个“新的子类别”链接和一个“后退”链接。
注意:我的答案变得有点广泛......我从我的一个使用类似结构的项目(用于(子)菜单)中复制并修改了它。所以希望我在修改过程中没有破坏任何东西...... :)
答案 1 :(得分:0)
class CreateCategories < ActiveRecord::Migration
def self.up
create_table :category do |t|
t.string :text
t.references :parent
t.timestamps
end
end