このバグは長期間存在しています。昨年調査した際の再現手順は以下の通りです。\n\n1. 管理者として、「最大お気に入りバッジ数」を2に設定し、複数回獲得可能なバッジを少なくとも1つ作成します。\n2. 一般ユーザーとして、2つのバッジをお気に入りとして設定します。そのうちの1つは複数回獲得可能なバッジ(以下、バッジA)です。\n3. 管理者として、ユーザーにバッジAを再度付与します。\n4. 一般ユーザーとして、ページをリロードし、バッジAのスター解除を試みます。ここでエラーが発生します。\n\nエラーの原因は、複数回獲得可能なバッジが付与されるたびに、データベースに新しいuser_badgeレコードが作成されることです。しかし、ユーザーがバッジをお気に入り登録している状態で再度付与された場合、新しいuser_badgeレコードは自動的にis_favoriteとしてマークされません。ユーザーがバッジAのスター解除を試みると、フロントエンドはデフォルトで最新のuser_badge IDを送信します。このレコードはis_favoriteとしてマークされていないため、バックエンドはユーザーが新しいバッジをお気に入り登録しようとしている(スター解除ではなく)とみなし、max favorite badgesの上限を超えていると判断してエラーが発生します。\n\n関連するコードは以下の場所にあります。\ndiscourse/app/controllers/user_badges_controller.rb at d3f09f8f61ac33f107fe1503fb4fd928877cfcd4 · discourse/discourse · GitHub UserBadge.where(badge: user_badge.badge, user: user_badge.user).pluck(:is_favorite).any? &&\n\n\nしかし、これではデータベースレコードの一貫性の問題は完全には解決しません。\n\n一時的な回避策として、一般ユーザーはコンソールで以下のJavaScriptコードを実行することで、すべてのお気に入りバッジのスターを解除できます。\n\njavascript\nconst user_name = require("discourse/models/user").default.current().username;\nconst badges = await require("discourse/models/user-badge").default.findByUsername(user_name);\nconst favorites = new Map();\nbadges.filter((b)=>\u003eb.is_favorite).forEach((b)=\u003efavorites.set(b.badge_id,b));\nfavorites.forEach((b)=\u003eb.favorite());\n```
「いいね!」 9