다계층 카테고리에서 ancestry를 사용하면 너무 편리했습니다.

다계층 카테고리를 다루려고 해서 여러가지 고생한 것과
결국은 ancestry라는 gem을 사용하여 잘 갔다 (아마)라는 이야기입니다.

완성 이미지



(일부이지만,,,)
・부모 카테고리/자 카테고리/손 카테고리가 있어, 카테고리끼리 3층의 관계성이 되어 있다.
・각각의 카테고리에 아이템이 들어가 있어, 카테고리 나누어 아이템 검색할 수 있다.


①DB 설계



당초, 아이템과 카테고리는 다대다가 되기 때문에 중간 테이블 만들고, 카테고리는 세분화해 넣으면 좋겠다.
라고 생각했습니다,,,
↓당초의 ER도


막상 진행해 보면, 친자손의 관계성 없지? 되어 변경.
다계층 카테고리 관리는 여러 가지 방법이 있는 것 같지만 호출이 간단합니다.
Path Enumeration(경로 열거형)으로 DB를 작성하기로 했습니다.

경로를 컬럼에서 관리하고 경로(Path) 기준으로 표시합시다는 느낌입니다(모호합니다만)
↓이런 느낌


id
path
item


1
null
여성

2
1
탑스

3
1/2
티셔츠


htps : // 카바타안. 하테나 bぉg. 코m/엔트리/2016/12/19/193430
(참고하신 기사입니다)

②도입



htps : // 기주 b. 코 m / s 테후 켄 k 로에 s / 안세 스트리
↑에 따르면 OK입니다!

Gemfile


gem 'ancestry'
$ bundle install
$ rails g migration add_ancestry_to_[table] ancestry:string:index
$ rake db:migrate
class Category < ApplicationRecord
      has_many :item_categories
    has_many :items, through: :item_categories
    has_ancestry
end
#カテゴリーモデルにアンセストリーを使うよ、って書いておく

준비 완료!
↓(ancestory를 사용하면 다대다가 아니라 일대다로 좋을 것 같습니다)
class Item < ApplicationRecord

 belongs_to user, foreign_key: 'user_id'
 belongs_to :category
  #(中略
end
class Category < ApplicationRecord
 has_many :items
 has_ancestry
end



③레코드 투입!



seeds.rb
lady = Category.create(:name=>"レディース")

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

lady_tops.children.create([{:name=>"Tシャツ/カットソー(半袖/袖なし)"}, {:name=>"Tシャツ/カットソー(七分/長袖)"},{:name=>"その他"}])
lady_jacket.children.create([{:name=>"テーラードジャケット"}, {:name=>"ノーカラージャケット"}, {:name=>"Gジャン/デニムジャケット"},{:name=>"その他"}])


ancestry를 넣으면 children이라고 기술하는 것으로 직전의 변수의 아이 요소로서 취급할 수 있습니다!
그래서 레이디스(부모) 탑스(아이) T셔츠(손자)라는 관계성을 레코드 작성시에 Gem이 해 주는 것입니다!
$ rake db:seed
1   レディース NULL
2   メンズ   NULL
:
13  その他   NULL
14  トップス    1
15  ジャケット/アウター    1
:
19  その他   1
20  Tシャツ/カットソー(半袖/袖なし)    1/14
21  Tシャツ/カットソー(七分/長袖)   1/14
22  シャツ/ブラウス(半袖/袖なし)    1/14
23  シャツ/ブラウス(七分/長袖)   1/14
:

레코드 투입 완료!

④View로 표시



컨트롤러
def index
  @parents = Category.all.order("id ASC").limit(13)
end
#1層目が13個なのでlimit(13)

뷰 부모 요소
- @parents.each do |parent|
 =parent.name



*CSS는 별도로 적용됩니다

자식 요소

- parent.children.each do |child|
 =child.name                                    



손자 요소

- child.children.each do |grandchild|
  =grandchild.name

#ちなみに、=grandchild.parent.nameとするとgrandchildrenの親要素を取得できます!



⑤결론



너무 편리합니다.

전화가 간단하고 좋네요.
아이로부터 부모도 부를 수 있으므로, 여러가지 사용법을 할 수 있을지도?

아직 ancestry에 관한 Qiita의 기사는 적게 느껴지기 때문에,
가능하면 Github의 ReadMe를 참조해야 할 것이라고 생각합니다.

잘못된 점, 개선점 등 있으면 댓글을 주시면 감사하겠습니다

참고로 한 기사



h tps://카바타안. 하테나 bぉg. 코m/엔트리/2016/12/19/193430
htps : /// ch 라쵸. bp 신 c. jp/바다/2018_03_15/53872
htps : // 이 m / 나카 _ 아키 히토 / ms / d42 A 6 Sea 40933 A f2352
htps : // 기주 b. 코 m / s 테후 켄 k 로에 s / 안세 스트리

좋은 웹페이지 즐겨찾기