LoginSignup
2
4

More than 3 years have passed since last update.

[ancestry]多重構造のカテゴリ 導入

Last updated at Posted at 2020-02-23

ECサイトのカテゴリ実装におきまして多重構造での実装が必要となったため
こちらの記事を残させていただきます。
多重構造とはなんぞやとの説明は参照記事をご覧ください。

関連リンク

jqueryで横開きのリストを作りたい

ancestry導入後起きやすいエラー(解消方)

migrationがうまく動かなくなることがあるので手順を下記に表示いたします

rake:db:migrateまたはrake:db:migrate:resetでなぜかエラーが出ませんか?
まず、rake db:resetを打ちます
rake db:migrateを打ちます
`rake db:seed'でいけないでしょうか?
時々、途中でエラー分が出ます。
エラー文のなかには ”これを打ち込んで” という一文がわかりやすく記載されているので
そのコマンドを打ち込みます。
さらに'rake db:migrate'これで行けるとはおもうのですが…

もちろんresetをかけることでDBに入っていたデータが全て消えてしまうリスクもございますので
それを念頭に入れて上で、消えても仕方ないといった場合はお試しください。

実装手順

1,Gemのインストール
2,モデルにアソシエーション定義
3,カテゴリの追加

4,ビューへの表示方法(こちらは別記事で書きます)

1,Gemインストール

ancestryのgithub
この手順通り記述します。

Gemfile
gem 'ancestry'

ターミナルでbundleの実行

bundle実行後、導入方法は2通りあります。(私の知る限りでは)

もしも、最初からテーブルを作成する場合は以下
ターミナル
$ rails g controller category
$ rails g model category
         #ここのcategory部分は作成したいモデル名

今作成されたmigration fileを下記のように記述

マイグレーションファイル
class CreateCategories < ActiveRecord::Migration[5.2]
  def change
    create_table :categories do |t|
      t.string :name, null: false
      t.string :ancestry
      t.timestamps
    end
    add_index :categories, :ancestry
  end
end

$ rake db:migrateをする。

すでにあるテーブルに追加する場合は以下のコマンドを打ちます。
[例]ターミナル
$ rails g migration add_ancestry_to_[table] ancestry:string:index
#ここの[table]に自分の作成したいテーブル名を記述します。
#そのまま入れてエラーになったw
#今回作りたかったのはカテゴリテーブルなのでcategoryと記述しました

$ rails g migration add_ancestry_to_category ancestry:string:index

$ rake db:migrateをする。

2,モデルにアソシエーション定義

models/category.rb
class Category < ApplicationRecord
  has_many :items
  has_ancestry
end
models/items.rb
#このテーブルはもともと作成済みのものです。
class Item < ApplicationRecord
  belongs_to user, foreign_key: 'user_id'
  belongs_to :category
end

3,カテゴリの追加

db/seeds.rb
#親要素
lady = Category.create(:name=>"レディース")

#子要素
lady_tops = lady.children.create(:name=>"トップス")
lady_jacket = lady.children.create(:name=>"ジャケット/アウター")

#孫要素(childrenと記述することで直前の変数の子要素として扱うことができる)
lady_tops.children.create([{:name=>"Tシャツ/カットソー(半袖/袖なし)"}, {:name=>"Tシャツ/カットソー(七分/長袖)"},{:name=>"その他"}])
lady_jacket.children.create([{:name=>"テーラードジャケット"}, {:name=>"ノーカラージャケット"}, {:name=>"Gジャン/デニムジャケット"},{:name=>"その他"}])
ターミナル
$ rake db:seed

これでancestryの準備完了です
残るはビューへの記述

こちらは実装途中ですので別記事にて書きます。
記載後はこちらにもリンクを貼ります。
参考記事には多重構造とは?といったし詳細の記載もございますので是非ご参考にしてください。

自身は初学者でございますので記事の内容等に不備等ございましたらご指摘いただけますと幸いです。
また、少しでもお役に立てましたら良いねいただければ喜びます。

どうぞよろしくお願い致します。

参考サイト

Github
ancestryによる多階層構造の実現
多階層カテゴリでancestryを使ったら便利すぎた
ancestryの使い方
[Rails] Ajax通信を用いたカテゴリボックス作成
データベース論理設計のアンチパターン

2
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4