6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ancestryで多段階カテゴリーを使う為のseeds.rb作成

Posted at

概要

某アプリの3段階カテゴリーの実装手順をまとめて行きます。
カテゴリーは1000個以上あるので、手動でやるのは地味過ぎるのでチャチャっと終わらせます。
手順はざっくり、
・各カテゴリー毎に、HTMLを取ってきてVScodeフル活用して整形
・Rubyで処理を書き、期待した配列を作る
・each文でいい感じに、DBに入れる
の3段階でやって行きます。
今回、上の2つは他の方の記事がわかりやすくまとまっているのでseedファイルの作成部分だけ軽くやって行きます。

※初投稿、初めて2ヶ月の初学者なので、お手柔らかにお願い致します!

参考資料

配列作成の参考
https://qiita.com/haruki127/items/e17f6fc7072389f0f6e3
ancestryのgithub
https://github.com/stefankroes/ancestry

カテゴリー配列の作成

上の参考記事を元に期待の配列を作成しました。
いくつかやり方はあると思いますが、今回のこの配列を作り、each文でやるのが楽だと思います。
もっと簡単な方法があれば教えてください!

seed.rbに記述する

今回期待するテーブルの形を再度確認してみます

id name ancestry
1 レディース null
2 トップス 1
3 Tシャツ 1/2
4 パーカー 1/2

1/2を私は勘違いして、二分の一かと思っていましたが、親カテゴリーと子カテゴリーのidが入っているだけでした。
これを難しく考えすぎて、1時間くらい無駄にしてしまいました…

本題に戻って、ひとまず親カテゴリーはそのまま入れれば問題ありません

seeds.rb

parents.each do |parent|
  Category.create!(
    name: parent,
  )
end

これで問題なく、親カテゴリーは入ると思います。
続いて子カテゴリーですが、ancestryのメソッドである.childrenを使ってDBに入れます。
既に親カテゴリーは作成されているのと、紐づく親カテゴリーは配列に入っているので、以下の様なコードになると思います。

seeds.rb

children.each do |child,num|
  parent = Category.find(num)
  parent.children.create!(
    name: child,
  )
end

孫カテゴリーも全く同じ要領でやって行きます。

seeds.rb
grandchildren.each do |grandchild,num|
  child = Category.find(num)
  child.children.create!(
    name: grandchild,
  )
end

以上を、記述したらファイルを実行すれば、完成!

まとめ

プログラミングを使えば単調な作業を一瞬で終えることが出来る良い例だと思い、記事にしました。
(これをコピペで頑張ってる人もいるとかいないとか…)
gemは必ず公式を一回みることをオススメします。見てもわからないって人もいると思いますが騙されたと思って毎回みましょう。
今後は軽めの記事を沢山のあげて行きたいと思っているので、参考にしたよ!って人いたらいいね!お願いします!

6
5
0

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
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?