宝石を使用せずに、レールでこれを行うにはどうすればよいですか?
メインカテゴリー
サブカテゴリ
サブカテゴリ
サブカテゴリ
メインカテゴリー
サブカテゴリ
サブカテゴリ
サブカテゴリ
メインカテゴリー
サブカテゴリ
サブカテゴリ
サブカテゴリ
|で構成されるテーブルがありますid |レベル1 |レベル2 |
レベル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>
サブカテゴリ(またはサブサブカテゴリなど)のそれ自体への参照を持つモデルを作成します。
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
のCategory
関連付けを定義します。つまり、同じテーブルを使用します。belongs_to
親カテゴリに戻る関係を定義します(オプション、必須ではありません)モデルの関連付けの詳細については、has_many
またはbelongs_to
、 Associations Basics 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
新しいカテゴリを追加するには、次を使用します。
def new
@category = Category.new
@category.parent = Category.find(params[:id]) unless params[:id].nil?
end
新しいカテゴリを作成し、提供されている場合は親を設定します(それ以外の場合はメインカテゴリになります)
注:私は古いRails構文(怠惰のため)を使用しましたが、Rails 3.2の場合も原理は同じです。
あなたのcategories/index.html.erb
次のようなものを使用できます:
<h1><%= @category.nil? ? 'Main categories' : category.text %></h1>
<table>
<% @categories.each do |category| %>
<tr>
<td><%= link_to category.text, category_path(category) %></td>
<td><%= link_to 'Edit', edit_category_path(category) unless category.parent.nil? %></td>
<td><%= link_to 'Destroy', category_path(category), :confirm => 'Are you sure?', :method => :delete unless category.parent.nil? %></td>
</tr>
<% end %>
</table>
<p>
<%= link_to 'Back', @category.parent.nil? ? categories_path : category_path(@category.parent) unless @category.nil? %>
<%= link_to 'New (sub-category', new_category_path(@category) unless @category.nil? %>
</p>
選択したカテゴリ(またはメインカテゴリ)の名前とそのすべてのサブカテゴリ(ニーステーブル)が表示されます。すべてのサブカテゴリにリンクし、同様のレイアウトを示しますが、サブカテゴリ用です。最後に、「新しいサブカテゴリ」リンクと「戻る」リンクを追加します。
注:私の答えは少し広範になりました...私は同様の構造を使用する私のプロジェクトの1つからそれをコピーして変更しました((sub-)メニュー)。だからうまくいけば、私は変更中に何も壊さなかった... :)
class CreateCategories < ActiveRecord::Migration
def self.up
create_table :category do |t|
t.string :text
t.references :parent
t.timestamps
end
end