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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
muryoimpl
August 16, 2025
Programming
55
0
Share
人魚とたわむれる
Kanazawa.rb meetup #156 祝13周年 LT大会 (石川県立図書館) でやった LT資料。
muryoimpl
August 16, 2025
More Decks by muryoimpl
See All by muryoimpl
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
1.4k
Kanzawa.rbのLT大会を支える技術の裏側を変更する Ruby on Rails + Litestream 編
muryoimpl
0
1.8k
Kanazawa.rb LT大会用/kzlt コマンドの説明 2024/01版
muryoimpl
0
3.1k
kzltコマンドの新たなソリューションについて
muryoimpl
0
3k
俺とTODOアプリ~Linearの変~
muryoimpl
0
2.8k
POSIX文字クラスでの躓き
muryoimpl
0
2.4k
/kzlt コマンドとは
muryoimpl
0
1.1k
meetup.kzrb.org の更新を考える 事前激闘編
muryoimpl
0
1.7k
meetup.kzrb.org の更新を 考える ゆるふわ編
muryoimpl
0
1.6k
Other Decks in Programming
See All in Programming
【26新卒研修】OpenAPI/Swagger REST API研修
dip_tech
PRO
0
140
実用!Hono RPC2026
yodaka
2
300
(Re)make Regexp in Ruby: Democratizing internals for the JIT
makenowjust
3
1k
GoogleCloudとterraform完全に理解した
terisuke
1
190
PHPでローカル環境用のSSL/TLS証明書を発行することはできるのか? #phpconkagawa
akase244
0
350
ソースコード→AST→オペコード、の旅を覗いてみる
o0h
PRO
1
130
From Formal Specification to Property Based Test
ohbarye
0
2.3k
【26新卒研修資料】TDD実装演習
dip_tech
PRO
0
170
実践ハーネスエンジニアリング:ステアリングループを実例から読み解く / Practical Harness Engineering: Understanding Steering Loops Through Real-World Examples
nrslib
5
4.6k
My daily life on Ruby
a_matsuda
3
190
t *testing.T は どこからやってくるの?
otakakot
1
910
2026-04-15 Spring IO - I Can See Clearly Now
jonatan_ivanov
1
190
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
72
12k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
290
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
The Spectacular Lies of Maps
axbom
PRO
1
740
The Art of Programming - Codeland 2020
erikaheidi
57
14k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
400
Claude Code のすすめ
schroneko
67
220k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.9k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
300
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.6k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
130
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につづく