この原因を突き止めるのに時間がかかりましたが、原因がわかったと思います。それは、このコードに関連していると思います。
def fetch_uploads(params:, guardian:)
return [] if !SiteSetting.chat_allow_uploads
guardian.user.uploads.where(id: params.upload_ids) # 具体的にはここ
end
新しいチャットメッセージが作成されると、メッセージに添付するアップロードを取得するためにこれが呼び出されます。おそらく所有権を確認するために、メソッドは Guardian のユーザーを通じてアップロードを取得し、そのユーザーに属するアップロードのみを許可するようにします。
問題は、こちらで見られるように、アップロードが重複排除されていることです。
# そのアップロードはすでにありますか?
@upload = Upload.find_by(sha1: sha1)
# ...
# 存在する場合は前のアップロードを返します
if @upload
add_metadata!
UserUpload.find_or_create_by!(user_id: user_id, upload_id: @upload.id) if user_id
return @upload
end
可能な修正策は、ユーザーに属するアップロードのみを考慮するのではなく、UserUpload を介して取得することだと思います。UserUpload はアップロードを複数のユーザーにリンクしており、それが私たちが必要としているもののようです。まだ完全に確信はありませんが、もう遅いので寝ます。もし他の人が修正しなければ、後で戻って PR を作成しようと思います。![]()