-
-
Notifications
You must be signed in to change notification settings - Fork 109
📥 Enable to download Dojo stats as CSV
for specific year
#1732
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Issue #1373 に関連した新機能の実装計画: - /dojos エンドポイントに年次フィルタリング機能を追加 - CSV/JSON形式でのデータエクスポート対応 - yearパラメータによる特定年のデータ取得(整数値のみ) - HTML表示でのデータプレビュー機能 - 全年次統計データと特定年データの両方をサポート
CSV
for specific year. 📊
主な改善点: - respond_toメソッドを使用してRailsの標準パターンに準拠 - 三項演算子でformat.json/csvのコードを簡潔に記述 - render_yearly_stats内の重複したパラメータチェックを削除 - より読みやすく保守しやすいコード構造に改善
重要な仕様の明確化: - yearパラメータなし: - HTML: 現在アクティブな道場のみ(既存動作維持) - CSV/JSON: 全道場(アクティブ + 非アクティブ) - yearパラメータあり(例: year=2024): - HTML/JSON/CSV すべて: その年末時点のアクティブ道場のみ すべての形式(HTML/JSON/CSV)がyearパラメータを正しく処理
render :index を明示的に記述することで、 3つの形式すべてで何がレンダリングされるかを コードリーディング時に一目で理解できるように改善
Phase 1(MVP): - 特定年のアクティブ道場ダウンロードは既に含まれている - yearパラメータによるフィルタリング機能を明記 Phase 2(将来): - 重複していた項目を削除 - 都道府県別フィルタリングなど真の拡張機能を記載
yearパラメータ指定時: - HTML/JSON/CSVすべてで非アクティブ道場を含まないことを確認 yearパラメータなし: - CSV/JSONは全道場(非アクティブ含む)を確認 - HTMLはアクティブのみ(既存動作)を確認 これにより仕様が正しく実装されることを保証
重要な気づき: - 既存の/dojosは既に全道場(非アクティブ含む)を返している - CSV形式のサポートを追加するだけで良い - render_yearly_statsなどの複雑なメソッドは不要 - yearパラメータでのフィルタリングのみ追加 これにより実装がシンプルになり、既存コードの変更を最小限に
11 tasks
主な変更内容: - /dojos エンドポイントにCSV形式サポートを追加 - yearパラメータによる年末時点のアクティブ道場フィルタリング - 年選択UIとダウンロードボタンをHTMLビューに追加 機能詳細: - GET /dojos.csv → 全道場リスト(CSV形式) - GET /dojos?year=2020 → 2020年末時点のアクティブ道場(HTML) - GET /dojos.json?year=2020 → 同上(JSON形式) - GET /dojos.csv?year=2020 → 同上(CSV形式) エラーハンドリング: - 無効な年が指定された場合はフラッシュメッセージでエラーを表示 - 2012年から現在年までの範囲チェック実装 Closes #1373
CSV
for specific year. 📊 /statsと/dojosの数値の違いを検証するテストを実装: - /stats: sum(:counter) - 支部数の合計 - /dojos: 道場の個数 - 各道場は1回のみカウント テスト結果: - 全年度でテスト成功 - 差分は複数支部を持つ道場(大田・邑南など)によるもの - 無効な年のリダイレクトも正常動作 docs: 仕様の違いを明確に文書化
- HTMLテーブルに支部数(counter)カラムを追加 - CSVファイルに支部数カラムと合計行を追加 - コントローラーで@counter_sumを計算して合計表示 - /statsの累積合計と視覚的に比較可能に これにより、/statsページの支部数合計(sum(:counter))と /dojosページの道場リスト(個別道場数)の違いが明確になる
新八尾道場(ID: 291)のcounter: 2を削除してデフォルト値1を使用。 背景: - 東大阪道場(ID: 41)と旧八尾道場(ID: 101)は合同運営だった - しかしYAMLには両道場が別々に記載されている - 重複カウントを避けるため、それぞれcounter: 1として扱う - 新八尾道場(ID: 291)は2022年11月開設の単独道場 現在の設定: - 東大阪道場: counter省略(デフォルト1) - 旧八尾道場: counter省略(デフォルト1) - 新八尾道場: counter: 2 → 削除(デフォルト1)
d4646d4
to
8a9a048
Compare
script/test_yearly_dojos_count.rb の内容をRSpecに移行。 CIでテストDBを使って自動実行可能に。 追加したテスト: - 年パラメータのバリデーション(2012-現在年) - 年次フィルタリング機能(全道場 vs 特定年のアクティブ道場) - counter(支部数)フィールドの表示と集計 - CSV形式の出力(ヘッダー、日付形式、合計行) - HTML形式の年選択UI また、Dojoファクトリーに必要な属性を追加。
- '🏢 支部数' → '☯️ 道場数' に変更(CoderDojoでは支部と呼ばない) - 道場名カラムに '🗾' アイコンを追加 - HTMLとCSVの両方で統一 - テストも合わせて更新
- '年を選択' → '対象期間' に変更(より汎用的な表現) - デフォルトラベル '全道場' → '全期間' に変更(道場ページなので冗長性を排除) - テストも合わせて更新
- HTMLビューから道場数(counter)カラムを削除 - 道場名に☯️アイコンを復活 - 詳細な道場数はCSVで確認可能なため、HTMLはシンプルに保つ - CSVには引き続き道場数カラムと合計を表示 - テストもHTML/CSVの役割分担に合わせて更新
- custom.scssに.stats-table .inactive-itemクラスを追加 - background-color: gainsboroスタイルを一元管理 - /dojosと/stats#prefecturesの両方で同じクラスを使用 - 将来的に他のテーブルでも再利用可能
- すべての形式(HTML/JSON/CSV)でアクティブな道場を先に表示 - order by is_active DESC, order ASC でソート - アクティブな道場が見つけやすくなり、非アクティブな道場は最後にまとめて表示
- Railsのtruncateヘルパーメソッドを使用 - 30文字を超えるURLは「...」で省略表示 - title属性で完全なURLをツールチップ表示 - リンク先は完全なURLを維持
- '年を選択すると' → '対象期間を選択すると' - 'その年末時点でアクティブだった道場のデータ' → 'その時点のアクティブな道場の一覧' - より簡潔で分かりやすい表現に
- フォントサイズとグレー色で説明文であることが明確 - 「※」記号は冗長なので削除
- onchangeイベントで選択と同時にページ遷移 - 「表示」ボタンを削除してUIをシンプルに - form_withタグも不要になったため削除 - より直感的で素早い操作が可能に
- h3タグにid='table'を追加し、📊アイコンを内部リンクに - 対象期間セレクトボックスの自動遷移に#tableアンカーを追加 - '全道場を表示'リンクにも#tableアンカーを追加 - ページ遷移後に自動的にテーブル位置へスクロール
- セレクトボックスで簡単に切り替えられるため冗長 - UIをよりシンプルに - 選択中の年のみを表示する簡潔な表示に
- 全期間選択時は ?year= パラメータを付けない - /dojos?year=#table → /dojos#table に修正 - 三項演算子で値がある場合とない場合を判定
- flash[:alert]を同じ位置に赤い背景色で表示 - 内部リンク(#table)でジャンプしても見える位置に配置 - リダイレクト時も#tableアンカーを追加 - Bootstrap風のアラートスタイル(background: #f8d7da)を適用
- エラーメッセージに具体的な入力値を含めない - '指定された年(値)は無効です' → '指定された年は無効です' - 現在も.to_iとHTMLエスケープで安全だが、より防御的な実装に - セキュリティのベストプラクティスに従う
CSV
for specific year
## 実装内容 - 'inline_' プレフィックスがついたflashメッセージは、デフォルト位置(ページ上部)では表示しない - 各ビュー内でカスタム位置に表示できるようにヘルパーメソッドを追加 - /dojos ページの年フィルタリングのアラートとインフォメッセージに適用 ## メリット - flashメッセージの2重表示問題を解決 - inline_alert → alert-alert のようにBootstrapのCSSクラスを自動適用 - 将来的に inline_warning, inline_success なども同じパターンで使用可能 - コードがシンプルになり、条件分岐が不要に ## 変更箇所 - flash[:alert] → flash[:inline_alert] に変更(エラー時) - flash.now[:inline_info] を追加(成功時) - render_inline_flash_messages ヘルパーメソッドを追加 - テストを inline_alert に対応
## 問題 - /dojos?year=2023 で2024年に非アクティブ化された道場が灰色表示されていた - 現在のis_activeを使用していたため、選択年時点の状態と異なっていた ## 解決策 - 選択年末時点でのアクティブ状態を計算するロジックを追加 - inactivated_atと選択年を比較して正しい状態を判定 ## テスト - inactive-item CSSクラスの存在をチェックするテストを追加 - TDDアプローチ:先にテストを書いて失敗を確認してから修正 ## 今後の課題(このPRではやらない) - inactive-item → inactivated-item へのCSS名変更 - is_activeカラムの削除(inactivated_atで代替可能) - 変数名・コメントのinactive → inactivatedへの統一
訪問者が主語として行動しやすいよう、動詞を使った表現に変更 - 年次データのフィルタリング → 年次データを取得する
選択した年の「開設道場数」と「合計道場数」を表示することで、 訪問者が /stats ページのグラフと数値を比較検証できるようにする 表示例: 2020年末時点のアクティブな道場を表示中 (開設道場数: 3 / 合計道場数: 7)
- 統計ラベルを修正:「開設道場数」→「開設数」、「合計道場数」→「合計数」 - 統計計算ロジックを/statsページと同一に修正(counter合計を使用) - 現在年の表示テキストを改善:「2025年末時点」→「2025年8月8日時点」 - 変数名を統一:start_of_year/end_of_year → year_begin/year_end - if-elseブロックを削除してコードをシンプル化 この修正により、/dojos?year=XXXXの統計値が/statsページの グラフ値と完全に一致し、訪問者が数値を正確に照合できるようになった。
現在年の表示を「2025年08月08日時点」から「2025年8月8日時点」に変更。 日本語として自然な表記(ゼロパディングなし)を採用。
全期間表示時に「全期間の道場を表示中(非アクティブ含む)」のメッセージを追加。 年別フィルタとの違いを明確化し、ユーザーの誤解を防止。 - デフォルト: 「全期間の道場を表示中(非アクティブ含む)」 - 年別フィルタ: 「YYYY年X月X日時点のアクティブな道場を表示中」 テストも追加し、25個すべてのテストが成功。
古い説明文を削除し、年次フィルタリング機能に対応した新しい説明に更新: - 削除: 「現在は活動停止中の道場も表示」(誤解を招く表現) - 削除: 直接JSON/CSVリンク(フィルタリング機能の説明に変更) - 追加: 対象期間選択機能の説明 - 追加: 全期間と年別フィルタの違いの明確化 訪問者が新機能を理解しやすい説明に改善。
統計グラフと詳細データの行き来を容易にし、CSVダウンロード機能を改善 ## 追加機能 ### 相互ナビゲーション - /dojosページに「» 推移グラフで見る」リンクを追加(/statsへ) - /statsページに「» 年次データを見る」リンクを追加(/dojosへ) - 英語版にも対応(View Annual Data) ### CSV機能の強化 1. 時点情報の明確化 - 状態カラムヘッダーに時点を追加 - 例:「状態 (2023年末時点)」「状態 (2025年8月8日時点)」 2. 動的ファイル名 - 年別:dojos_2023.csv - 全期間:dojos_all.csv - 複数年のデータ管理が容易に 3. 閉鎖日カラムの追加(全期間CSVのみ) - アクティブな道場:空欄 - 非アクティブな道場:閉鎖日を表示 - 道場のライフサイクル全体を把握可能 ## 改善効果 - ユーザーが統計グラフと詳細データをシームレスに分析可能 - CSVデータの時点が明確になり誤解を防止 - ダウンロードファイルの管理が容易に
CSVファイルの最後にあった合計行を削除し、プログラムでのパース時の エラーを防止 ## 削除理由 - 合計行のデータ型が各カラムと不一致(IDカラムに「合計」文字列など) - CSVパーサーでのエラーや警告の原因になる - データ分析ツール(Excel、pandas等)での処理を妨げる ## 改善効果 - CSVファイルが標準的なフォーマットに準拠 - プログラムでの自動処理が容易に - データの一貫性が向上
CSVから合計行を削除したことに伴い、関連するテストを更新 ## 変更内容 1. counter合計値のテストを個別道場のcounter値確認に変更 2. 合計行の存在確認テストをデータ一貫性確認テストに変更 3. 全期間CSVのヘッダーに閉鎖日カラムを追加 ## テスト結果 - 全25個のテストが成功 - CSVデータの一貫性が保証される
だいたい仕上がったのでマージ&デプロイします!!🚀✨ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
📊 道場統計の年次フィルタリング機能とCSV/JSONダウンロード対応(完成版)
🎯 概要
CoderDojo一覧ページ(
/dojos
)に年次フィルタリング機能を追加し、特定年末時点でアクティブだった道場の一覧をHTML表示・CSV・JSON形式でダウンロードできる機能を実装しました。/stats
ページのグラフとの完全統合により、統計分析と詳細データ確認がシームレスに行えます。✅ 実装完了機能
🔍 年次フィルタリング機能
#table
アンカーで自動的にテーブル位置へスクロール📊 統計データのエクスポート
ID, 道場名, 道場数, 都道府県, URL, 設立日, 状態
🎨 UX/UI改善
/stats
ページのグラフとの比較検証が可能2025年8月8日時点のアクティブな道場を表示中(開設数: 15 / 合計数: 199)
gainsboro
背景色で視覚的に区別(/stats#prefectures
と統一).stats-table .inactive-item
を作成truncate
ヘルパーで省略表示💬 情報表示の改善
🛡️ Flashメッセージの表示位置制御(汎用パターン)
inline_*
プレフィックスでカスタム位置に表示flash[:inline_alert]
で赤いアラートflash.now[:inline_info]
で青い情報メッセージrender_inline_flash_messages
で再利用可能にinline_alert
→alert-alert
クラスに変換⚡ パフォーマンス最適化
active_at
スコープを活用した時点ベースのフィルタリングyear_begin
/year_end
で統一(可読性向上)🐛 重要なバグ修正
TDDアプローチによる年フィルタリング問題の修正
is_active
を使用していたため、選択年時点の状態と異なっていた📈 統計精度の大幅改善
/statsページとの完全一致
/stats
ページと同一の計算方法を採用counter
合計counter
合計データ整合性の確認
inactivated_at
データとis_active
フラグが100%一致🧪 包括的テスト実装
inactive-item
)の正しい適用テスト🔒 セキュリティ対策
🎨 実装で得られた技術的知見
複雑度管理の重要性
段階的リファクタリングの価値
year_begin
/year_end
の統一命名で関連性を明確化📊 改善効果
ユーザーにとっての価値
開発・運用面の改善
🔍 パフォーマンス検証結果
🧪 動作確認
/dojos
/dojos?year=2024
/dojos?year=2025
(「2025年8月8日時点」と表示)/dojos.csv?year=2024
/dojos.json?year=2024
/dojos?year=2026
(フィルタリングセクション内に表示)📋 実装タスク完了状況
✅ 完了済み
⏳ 将来のPRで対応予定
is_activeカラムの削除
inactivated_at
カラムで代替可能命名の統一(inactive → inactivated)
inactive-item
→inactivated-item
🔗 関連情報
inactivated_at
toDojo
model to replaceis_active
boolean column #1726 (inactivated_at
カラムの追加)🚀 レビュー・マージ準備完了
この機能により、CoderDojo.jpの統計機能が大幅に向上し、ユーザーは詳細な年次データを効率的に分析できるようになります。全25個のテストが成功し、パフォーマンスも良好です。