Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
人魚とたわむれる
Search
muryoimpl
August 16, 2025
Programming
0
35
人魚とたわむれる
Kanazawa.rb meetup #156 祝13周年 LT大会 (石川県立図書館) でやった LT資料。
muryoimpl
August 16, 2025
Tweet
Share
More Decks by muryoimpl
See All by muryoimpl
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
590
Kanzawa.rbのLT大会を支える技術の裏側を変更する Ruby on Rails + Litestream 編
muryoimpl
0
1.5k
Kanazawa.rb LT大会用/kzlt コマンドの説明 2024/01版
muryoimpl
0
3k
kzltコマンドの新たなソリューションについて
muryoimpl
0
2.9k
俺とTODOアプリ~Linearの変~
muryoimpl
0
2.6k
POSIX文字クラスでの躓き
muryoimpl
0
2.3k
/kzlt コマンドとは
muryoimpl
0
990
meetup.kzrb.org の更新を考える 事前激闘編
muryoimpl
0
1.6k
meetup.kzrb.org の更新を 考える ゆるふわ編
muryoimpl
0
1.6k
Other Decks in Programming
See All in Programming
AI & Enginnering
codelynx
0
110
AI時代の認知負荷との向き合い方
optfit
0
160
CSC307 Lecture 07
javiergs
PRO
1
550
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
6.1k
Data-Centric Kaggle
isax1015
2
780
Apache Iceberg V3 and migration to V3
tomtanaka
0
160
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
360
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
200
AI巻き込み型コードレビューのススメ
nealle
2
400
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
7
2.3k
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
200
CSC307 Lecture 01
javiergs
PRO
0
690
Featured
See All Featured
Writing Fast Ruby
sferik
630
62k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
So, you think you're a good person
axbom
PRO
2
1.9k
Rails Girls Zürich Keynote
gr2m
96
14k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
120
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.1k
Speed Design
sergeychernyshev
33
1.5k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Discover your Explorer Soul
emna__ayadi
2
1.1k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
Transcript
人魚とたわむれる Kanazawa.rb meetup #156 祝13周年 LT 大会 石川県立図書館 2025-08-16(Sat) muryoimpl
ある日、DB項目ないの? テーブルに何もってるか知りたいんだけど と、言われる
ないんだわ、これが • 継続的成長を義務付けられたソフトウェアについては、項目書作ったときから陳腐 化する • 生温かい手で作ると工数がとんでもなくかかる • 上記理由から、人類が一から頑張ってつくるものではない そうか、自動生成か …となる
調べると gem はありそうだが … • erd や rails-mermaid_erd 、rails-mermaid_erd_markdown など今使われていそう
な gem はある • ただし、大量のテーブルがあるシステムで、グループ化して表示できないと見づら い。とても見づらい。 • 中身を見ると、オープンクラスを駆使して手を入れるにも改造しにくそうな作りになっ てる • インフラ構築を前提とした環境にしたくないな。 • 出力対象外にしたいテーブルがある。日本語名も併記したい
やはり自作するしかないか!
DB情報からテーブルと関連の情報を作って出力するぞ • モデル とモデル同士の関連の情報から、mermaid の ER図を、日本語併記で出力 する • 普段は Notion
を使っているので、Notion のページに language: mermaid として 記述する ◦ 定期実行で更新できそうだしよさそう • i18n の日本語辞書を使い、翻訳がある場合はそれを併記する • ER図にしたのは、クラス図と違ってカラムを足すことができるため ◦ 追加したカラムに日本語名を出す
というので作った https://gist.github.com/muryoimpl/1 d2f325e11074529dab55011967b91b2 TODO: 後でSlack に貼るぞい
つくりはこんな感じ • ApplicationRecord を継承したモデル(テーブルに対応したモデル)を抽出する • column でカラム情報、relations で関連情報を抽出する • i18n
でテーブル、カラムの日本語名を当てる。なければ日本語名を出さない • 設定YAML で、グループ化と無視するテーブルを指定する • has_many, has_one, belongs_to から関連する線の種類を判別して出力する • 一旦、Notion 反映は待って、単純にグループ毎に markdown を出力する
erDiagram "channels: channel" { integer id "" string name "channel名"
string slack_channel_id "チャネルID" integer workspace_id "ワークスペースID" datetime created_at "作成日時" datetime updated_at "更新日時" } "entries: エントリー" { integer id "" string title "発表タイトル" integer status "ステータス" integer channel_id "チャネルID" integer user_id "発表者" datetime created_at "作成日時" datetime updated_at "更新日時" } "users: 発表者" { integer id "" string name "ユーザー名" string slack_user_id "user_id" datetime created_at "作成日時" datetime updated_at "更新日時" } "workspaces: workspace" { integer id "" string name "ワークスペース名" datetime created_at "作成日時" datetime updated_at "更新日時" string slack_team_id "team_id" } "channels: channel" ||--o{ "entries: エントリー" : "" "users: 発表者" ||--o{ "entries: エントリー" : "" "workspaces: workspace" ||--o{ "channels: channel" : ""
erd_mermaid.yml にgroupsに配列を渡 すことで複数のテーブルをグループ化し、 別々のファイルに出力することができる ```yaml groups: environment: - workspaces -
channels entries: - users - entries ```
感想 • has_and_belongs_to_many は未対応で、本体は 300 行くらいで実装できた • モデル情報と関連情報を扱うモデル、出力モデルを分けると、複数の出力形式に 対応できそうですね。 •
i18n 対応と、mermaid で日本語を扱うときの制限が辛かった ◦ 日本語は “あああ” のようにダブルクウォートで囲む必要がある ◦ 関連に名前を付けるの必須だと!? ただし、”” で空文字にできる ◦ Notionだと、direction 指定が使えない。(オブジェクトとして判定されちゃった) • 早くNotion連携版を作らねばならぬ
2につづく