Skip to content

Q&A自動クローズ機能のリファクタリングと仕様改善#9653

Draft
ryufuta wants to merge 17 commits intomainfrom
chore/refactor-question-auto-close
Draft

Q&A自動クローズ機能のリファクタリングと仕様改善#9653
ryufuta wants to merge 17 commits intomainfrom
chore/refactor-question-auto-close

Conversation

@ryufuta
Copy link
Contributor

@ryufuta ryufuta commented Feb 15, 2026

Issue

概要

未解決質問数のキャッシュ削除時のログ出力の変更

仕様について

変更確認方法

確認内容は以下。

  • 変更した箇所がデグレしていない
    • 直近1ヶ月間コメントがない未解決のQ&Aにpjordから警告メッセージが投稿される
    • 警告メッセージ投稿後に更新のないQ&Aに対して1週間後にpjordからクローズメッセージが投稿されて解決済みになる
    • 警告メッセージが投稿された際に質問作成者に通知が届く
      • 質問をWatch中のユーザーにも通知が届くことの確認手順は省略。本PRではsubscriberの設定は変更していないためいずれかに通知が届けば一方にも通知が届くはずなので。
    • 質問が自動クローズされると未解決質問数のキャッシュが削除される
      • ログ出力
  • WIPの質問には直近1ヶ月間更新されていなくても警告メッセージが投稿されない
    • 警告メッセージが投稿されなければ自動クローズされないためWIPの質問が自動クローズしないことの確認はパス(自動テストでは確認済み)
  • WIPから公開への変更によって警告までのカウントダウンがリセットされる
    • 質問更新(タイトル、本文、質問者、紐づくプラクティス、タグ、公開設定のいずれかの変更)または回答の更新(内容の編集またはベストアンサーの決定・取り消し)によってカウントダウンがリセットされるが、シナリオとして重要なのはWIPから公開への変更なので他は省略。

事前準備

  1. chore/refactor-question-auto-closeをローカルに取り込む
  2. bin/rails db:seedを実行して初期データを更新する(本PRで初期データを追加したため)
  3. 定期処理を実行できるようにするためローカル環境に環境変数TOKENを設定する
    設定方法は Q&Aを自動的にクローズする機能のバグ修正 #9024 (comment) の事前準備の項目を参照

動作確認

  1. ローカルサーバーを起動
  2. http://localhost:3000/scheduler/daily/auto_close_questions?token=hoge にアクセス(定期処理が実行される)
  3. 任意のユーザーでログイン(kimuraでログインすると以降の操作が楽)
  4. 自動クローズ前に警告される質問 (直近1ヶ月間更新されていない未解決のQ&A)に警告メッセージが投稿されていることを確認
  5. 自動クローズされる質問 (警告メッセージが投稿されてから1週間経過した未解決のQ&A)にクロージングメッセージが投稿されて解決済みになっていることを確認
  6. 警告メッセージが投稿されたという通知が届いていることを確認
    1. kimura(警告される質問の作成者)でログインしてサイト内通知に「pjordさんから回答がありました。」という通知が届いていることを確認
    2. http://localhost:3000/letter_opener にアクセスしてメール通知も届いていることを確認
  7. wipの質問 (直近1ヶ月間更新されていないWIPのQ&A)には警告メッセージが投稿されていないことを確認
  8. kimura(編集権限のあるユーザー)で wipの質問 の「内容修正」をクリックして「質問を公開」する
  9. http://localhost:3000/scheduler/daily/auto_close_questions?token=hoge にアクセス
  10. wipの質問 には公開後も警告メッセージが投稿されていないことを確認

Screenshot

変更前

変更後

Summary by CodeRabbit

リリースノート

  • Refactor

    • 質問の自動クローズ機能の内部処理を最適化しました。
  • Tests

    • 自動クローズ機能のテストカバレッジを拡充し、警告メッセージやステータス遷移を含むシナリオを追加しました。
  • Chores

    • テストデータを更新しました。

2種類の固定化されたシステムメッセージを検出できれば良いので正規表現を使用して多様なパターンを検出できるようにする意味がない
文字列の完全一致の方が意図が明確かつ処理が速い
修正前: 自動クローズメッセージを通常の回答として投稿、すぐ削除して同じ回答をベストアンサーとして再投稿
修正後: 自動クローズメッセージをベストアンサーとして投稿

ユーザーによるベストアンサー決定と同じように一度通常の回答を経由したかったようだが、意味がないため読みにくく不要なDBアクセスも生じるため修正した
修正前: 警告から1週間経過したQ&Aはその間に回答追加などの活動があっても自動クローズする。一度自動クローズしたQ&Aは未解決に戻しても自動クローズ機能の対象外になる。
修正後: 警告後1週間以内に回答追加などの活動があると自動クローズのカウントダウンをリセットする。一度自動クローズしたQ&Aも未解決に戻すと自動クローズ機能の対象になる。

修正前の仕様は意図したものではなくユーザーにとって不親切、ロジックも不必要に複雑だったため修正
他のテストケース名に合わせてテスト内容を説明する名前にした
- システムユーザーをDBから一度だけ取得することで効率化
- システムユーザーをインスタンス変数にすることでメソッドの引数を削減
- システムユーザーが存在しないときにエラーで停止するようにした
`#create_warning_message`と一貫性のある名前にした
名前空間から`WARNING_MESSAGE`だけで意味が通じ、簡潔で英語的にも自然
@ryufuta ryufuta self-assigned this Feb 15, 2026
@coderabbitai
Copy link

coderabbitai bot commented Feb 15, 2026

📝 Walkthrough

ウォークスルー

QuestionAutoCloserが、クラスメソッドベースの設計からインスタンスメソッドベースの設計へリファクタリングされています。定数が SYSTEM_USER_LOGIN から SYSTEM_USER_LOGIN_NAME に、AUTO_CLOSE_WARNING_MESSAGE から WARNING_MESSAGE に名前変更され、コントローラーと既存テストも更新されました。

変更内容

Cohort / File(s) Summary
コントローラー実装更新
app/controllers/scheduler/daily/auto_close_questions_controller.rb
QuestionAutoCloserのクラスメソッド呼び出しをインスタンスメソッド呼び出しに置き換え。QuestionAutoCloser.newでインスタンス化し、post_warningの後にclose_inactive_questionsを実行。
モデルリファクタリング
app/models/question_auto_closer.rb
クラスメソッドをインスタンスメソッドに変換し、initializeを追加。定数をSYSTEM_USER_LOGIN_NAMEとWARNING_MESSAGEに名前変更。システムユーザーの解決方法を変更。
テスト基盤
test/models/question_auto_closer_test.rb, test/supports/question_auto_closer_helper.rb
インスタンスベースのテストに移行。QuestionAutoCloserHelperヘルパーモジュールを追加し、create_questionメソッドを提供。テストカバレッジを拡張し、WIPハンドリングや警告シーケンスを検証。
フィクスチャ拡張
db/fixtures/answers.yml, db/fixtures/questions.yml
answer51の説明をWARNING_MESSAGEに更新。answer52~answer60を追加し、複数の質問に対応するテストデータを充実。question53~question55の新規質問を追加。

推定コードレビュー工数

🎯 3 (中程度) | ⏱️ ~20分

関連する可能性のあるIssue

関連する可能性のあるPR

推奨レビュアー

  • komagata
  • karlley
  • okuramasafumi

ウサギの詩

🐰 クラスの日々はさようなら、
インスタンスの新しき夜明け!
post_warningと共に舞い踊り、
close_inactive_questionsで締めくくる✨
質問たちはきっと喜ぶよ🎉

🚥 Pre-merge checks | ✅ 2 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive PRの説明は変更確認方法が中程度に記載されているが、「概要」「仕様について」の記載がなく、テンプレートの必須セクションが不完全です。 「概要」セクションに変更の目的や背景を追加し、「仕様について」の下に仕様詳細を記載してください。
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed プルリクエストのタイトルはQ&A自動クローズ機能のリファクタリングと仕様改善を正確に説明しており、変更セットの主要な内容と明確に関連しています。
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch chore/refactor-question-auto-close

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@ryufuta ryufuta marked this pull request as draft February 15, 2026 10:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant