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
23
人魚とたわむれる
Kanazawa.rb meetup #156 祝13周年 LT大会 (石川県立図書館) でやった LT資料。
muryoimpl
August 16, 2025
Tweet
Share
More Decks by muryoimpl
See All by muryoimpl
Kanzawa.rbのLT大会を支える技術の裏側を変更する Ruby on Rails + Litestream 編
muryoimpl
0
1.3k
Kanazawa.rb LT大会用/kzlt コマンドの説明 2024/01版
muryoimpl
0
3k
kzltコマンドの新たなソリューションについて
muryoimpl
0
2.9k
俺とTODOアプリ~Linearの変~
muryoimpl
0
2.5k
POSIX文字クラスでの躓き
muryoimpl
0
2.3k
/kzlt コマンドとは
muryoimpl
0
960
meetup.kzrb.org の更新を考える 事前激闘編
muryoimpl
0
1.6k
meetup.kzrb.org の更新を 考える ゆるふわ編
muryoimpl
0
1.5k
最近のデスク周りの diff / kzrb meetup#108-2
muryoimpl
0
37
Other Decks in Programming
See All in Programming
TVerのWeb内製化 - 開発スピードと品質を両立させるまでの道のり
techtver
PRO
1
890
JEP 496 と JEP 497 から学ぶ耐量子計算機暗号入門 / Learning Post-Quantum Crypto Basics from JEP 496 & 497
mackey0225
2
280
モビリティSaaSにおけるデータ利活用の発展
nealle
0
180
PyCon mini 東海 2025「個人ではじめるマルチAIエージェント入門 〜LangChain × LangGraphでアイデアを形にするステップ〜」
komofr
3
980
Dive into Triton Internals
appleparan
0
490
HTTPじゃ遅すぎる! SwitchBotを自作ハブで動かして学ぶBLE通信
occhi
0
250
Building AI with AI
inesmontani
PRO
0
170
All(?) About Point Sets
hole
0
120
2025 컴포즈 마법사
jisungbin
0
120
CloudNative Days Winter 2025: 一週間で作る低レイヤコンテナランタイム
ternbusty
1
190
ゼロダウンタイムでミドルウェアの バージョンアップを実現した手法と課題
wind111
0
110
Atomics APIを知る / Understanding Atomics API
ssssota
1
150
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Large-scale JavaScript Application Architecture
addyosmani
514
110k
Into the Great Unknown - MozCon
thekraken
40
2.2k
Become a Pro
speakerdeck
PRO
29
5.6k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Optimizing for Happiness
mojombo
379
70k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
118
20k
The Cost Of JavaScript in 2023
addyosmani
55
9.2k
Side Projects
sachag
455
43k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
Git: the NoSQL Database
bkeepers
PRO
432
66k
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につづく