Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
繰り返し予定に「出欠」を足す
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
ちぇる
October 13, 2026
99
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
繰り返し予定に「出欠」を足す
ちぇる
October 13, 2026
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
490
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Amusing Abliteration
ianozsvald
1
350
Game over? The fight for quality and originality in the time of robots
wayneb77
1
310
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
450
Accessibility Awareness
sabderemane
1
250
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
67k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
570
Transcript
繰り返し予定に 「出欠」を足す カレンダー機能で行った設計判断の話 2026-09-19 名古屋Ruby会議 株式会社スタメン
自己紹介 狩戸 流星 株式会社スタメン Ruby / Rails 歴は3〜4年 趣味は歴史を学ぶこと 2
エンゲージメントプラットフォーム「TUNAG」 3
TUNAG でできること 今日話すのは、この中のカレンダー 4
カレンダー 5
繰り返し予定 TUNAG でも提供しています 6
今日から毎日、 予定を入れます 終了日は決めません 7
「終了日なし」 TUNAG では 9999-12-31 23:59:59 まで 8
1日1行ずつ レコードを作るとしたら? 9
2,912,182 行 — 約 7,973 年分 10
型の id に入る 最大値は 21億4748万3647 INT 738人ぶんのレコードで、ちょうどこれを超える 11
素直に作るわけには いかない 12
RRULE 日付ではなく、ルールを持つ 13
291万行が、これだけ DTSTART;TZID=Asia/Tokyo:20260919T090000 RRULE:FREQ=DAILY — 開始日時。 TZID でタイムゾーンを持つ FREQ — 繰り返しの単位。
DAILY / WEEKLY / MONTHLY / YEARLY INTERVAL / BYDAY — FREQ=WEEKLY;INTERVAL=2;BYDAY=MO で隔週の月曜 UNTIL / COUNT — 終了日 / 回数。この例には無い = 終わらない DTSTART 14
保存するのは、 この文字列だけ 日付は、読むときに展開する 15
でも、ユーザーは編集する 16
「3回目だけ 10:00 に」 毎週月曜 9:00 の予定を、1回だけずらしたい 17
レコードが2件増える before • ─ • ─ • ─ • ─
• 1レコード(RRULE) after • ─ • ─ ✕ ─ • ─ • • 除外を1件 10:00 を1件 — 「9:00 の回は出さない」 calendar_events — 10:00 の予定そのもの。新しく作られる 元の繰り返しレコードは、変更されない calendar_event_exceptions 18
1シリーズを展開する3ステップ 1. recurrence_rule を展開して、全部の回を出す 2. exceptions にある日を落とす 3. 分割されたレコードを足す 19
編集の単位は3つ 「この日だけ」「この日以降」「すべて」 20
「この日だけ」編集 さっき見たパターン。その回を除外して、差し替えを1件足す before after • ─ • ─ • ─
• ─ • • ─ • ─ ✕ ─ • ─ • • exceptions に1件 events に1件 21
「この日以降」編集 系列を2つに割る before after • ─ • ─ • ─
• ─ • • ─ • • ─ • ─ • 元のレコード(until_at を切り詰め) 新しいレコードを1件 22
「すべて」編集 分割された状態から、1レコードに戻す before after • ─ • ─ ✕ ─
• ─ • • • ─ • ─ • ─ • ─ • 元のレコードを直接更新 分割レコードと exceptions は全削除 23
ここに「出欠」を足す 今日の本題。仕事でやったことです 24
回答の単位も3つ 「この日だけ出られない」 「この日以降は出ません」 「すべて出ます」 予定の編集と、まったく同じ3つ 25
最初の案 同じやり方でいけるのでは? 「この日だけ不参加」→ 除外して、新しいレコードを作る 26
参加者ごとに、分割する? Aさんが1回休む Bさんが1回休む Cさんが1回休む • ─ • ─ ✕ ─
• ─ • • ─ ✕ ─ • ─ • ─ • • ─ • ─ • ─ ✕ ─ • +2レコード +2レコード +2レコード … × 参加者の数 27
不採用 28
理由:関心事が混ざる 予定レコードの分割は「予定の内容が変わった」ことを表すもの Aさんの参加 / 不参加の表明は、予定の変更ではない イベントのレコード構造には、一切触れない 29
出欠は独立テーブルで持つ calendar_event_attendance_responses 持つのは3つだけ — いつからの回答か scope — その回だけか、それ以降もか( this_only /
this_and_following ) status — 参加 / 不参加 「未回答」はレコードが無いことで表す effective_from 30
3つの単位の回答を元に、 DB側で MECE に整合性をとる 31
どの回も、ちょうど1つに決まる Aさんの回答は、この3件だけ 9/28 10/5 10/12 10/19 10/26 11/2 • •
• • • • シリーズ ① 参加(この日以降) ② 不参加(この日以降) ③ 参加(この日だけ) ▼ 結果 未回答 参加 参加 不参加 参加 不参加 32
まとめ 1. 複雑な仕様は、パターンを全部書き出してから触る 2. 既存パターンの流用は、関心事が違うなら疑う 3. 必要な情報だけを持たせて、MECE に保つ 33
We are hiring! スタメンは絶賛採用中です 34