技術

Railsでseed_fuとclosure_treeを同時に使って困ったこと

Pocket

Rails6で以下gemを使って初期データ投入しようとしたら困った事になったのでメモ

seed_fu

https://github.com/mbleigh/seed-fu
Railsの初期seedより気の利いた初期データ投入ができるgem

closure_tree

https://github.com/ClosureTree/closure_tree
閉包テーブルを実現できるgem

問題1:superclass mismatch for class〜って怒られる

seed_fuでclosure_tree使ったmodelのデータ生成しようとしたら以下のメッセージで怒られた

TypeError: superclass mismatch for class FolderPath

例として、フォルダの階層構造を実現するという事で。
階層にしたいモデルは以下の通り。

ここのhas_closure_treeの設定で怒られてる。
FolderPathモデルはこんな感じ

しかしclosure_treeの中では(lib/closure_tree/support.rb)

男気あふれるモデル動的生成をしているのだった
つまりわざわざFolderPathというモデルのファイルは作らなくていいのだ
hierarchy_class_nameはどんなモデルのクラス名にするか聞いてるだけで、別に明示的にモデル作らなくてよかったんだ。

そしてもしFolderPathモデルを書いてみるとなると、こうなる。
ApplicationRecordじゃなくてActiveRecord::Baseを継承する。

問題2:seed_fuでclosure_tree使ったmodelのデータ生成したら、modelのデータ自体は保存されてたけどclosure_treeのpathデータが保存されてない

Folderのデータを保存したらFolderPathに階層データが保存されてほしい。だってclosure_treeだもん。
しかし階層データが保存されてなくてとっても謎。conosleから保存した時はちゃんとpathデータ保存されていたので、設定ミスとかじゃなさそうな事はわかった。

seed_fuの中はこんな感じに書いている

そうです、さきほどのFolderモデルの設定ファイルをみたらお分かりの通り、必須項目が足りないではないですか。
なぜ必須項目なのにエラーも出さずにそのまま保存できちゃうかっていうと
seed_fuの中身を見てみると、/seed-fu/lib/seed-fu/seeder.rbの中で以下のような処理をしているよ。

というわけで、validationをオフにして保存しています。
細かいところ見てないので推測だけど、validation通過後に保存するはずだったclosure_treeのpathデータが保存されてなかった的な事なんじゃないだろうか。
こちら必須項目を追加したら問題なくpathデータも保存されました。やったね。

Pocket

mm

作成者: ぴーやま

なんとかエンジニア。忘れっぽいのでブログにメモをしている。 最近、一番好きな食べ物は汁物に浮いているたまごなんじゃないかなぁと思ってきた。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください