Мне потребовалось некоторое время, чтобы разобраться в этом, но я, кажется, нашёл причину. Проблема, думаю, связана с этим кодом:
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 связывает вложения с несколькими пользователями, что, кажется, именно то, что нам нужно. Пока я не на 100% уверен, как это правильно реализовать; уже поздно, поэтому я ложусь спать, но если никто другой не исправит это, я вернусь позже и попробую подготовить PR. ![]()