20

宝石を使用せずに、レールでこれを行うにはどうすればよいですか?

メインカテゴリ
 サブカテゴリ  サブカテゴリ
 サブカテゴリ

メインカテゴリ
 サブカテゴリ  サブカテゴリ
 サブカテゴリ

メインカテゴリ
 サブカテゴリ  サブカテゴリ
 サブカテゴリ

|で構成されるテーブルがあります id | レベル1| レベル2|

レベル1がメインカテゴリで、レベル2がサブカテゴリです

上記のように表示してほしい。

インターネットで見回した後、誰もが木のような行為の宝石を使用することをお勧めしているようですが、私はレールにかなり慣れていないので、宝石に頼るのではなく、物事を行う方法を理解したいので、それらを使用しないようにします。

あなたの助けは大いに感謝されます

モデル:

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>
4

2 に答える 2

61

サブカテゴリ(またはサブサブカテゴリなど)のそれ自体への参照を持つモデルを作成します。

class Category < ActiveRecord::Base
  has_many :subcategories, :class_name => "Category", :foreign_key => "parent_id", :dependent => :destroy
  belongs_to :parent_category, :class_name => "Category", :optional => true
end
  • モデルタイプの関連付けを定義has_manyします。つまり、同じテーブルを使用します。subcategoriesCategory
  • belongs_to、親カテゴリに戻る関係を定義します。@category.parent_category

モデルの関連付けの詳細については、has_manyまたはbelongs_to参照してください。

テーブルを作成するには、次の移行を使用します。

class CreateCategories < ActiveRecord::Migration
  def self.up
    create_table :category do |t|
      t.string      :text
      # table name should be in plural 
      t.references  :parent_category, foreign_key: { to_table: :categories }
      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.parent_category
  # We want to reuse the index renderer:
  render :action => :index
end

新しいカテゴリを追加するには、次を使用します。

def new
  @category = Category.new
  @category.parent_category = Category.find(params[:id]) unless params[:id].nil?
end 

新しいカテゴリを作成し、提供されている場合は親カテゴリを設定します(それ以外の場合はメインカテゴリになります)

注:私は(怠惰のために)古いrails構文を使用しましたが、Railsの最新バージョンでも原則は同じです。

あなたの中で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_category.nil? ? categories_path : category_path(@category.parent_category) unless @category.nil? %>
  <%= link_to 'New (sub-category', new_category_path(@category) unless @category.nil? %>
</p>

選択したカテゴリ(またはメインカテゴリ)の名前とそのすべてのサブカテゴリが(素敵な表に)表示されます。すべてのサブカテゴリにリンクし、同様のレイアウトを示しますが、サブカテゴリ用です。最後に、「新しいサブカテゴリ」リンクと「戻る」リンクを追加します。

于 2013-01-07T14:36:45.500 に答える
0
class CreateCategories < ActiveRecord::Migration
  def self.up
    create_table :category do |t|
      t.string      :text
      t.references  :parent
      t.timestamps
    end
  end
于 2019-11-17T05:35:15.010 に答える