Я работаю над проектом Ruby-on-Rails, использующим ActiveStorage, связанный с AWS-S3, для загрузки и хранения файлов.Я использую clowne gem для клонирования моих объектов.
Я хочу клонировать объект с прикрепленным файлом, и в то же время клонировать и этот файл (поэтому клонируйте его тоже в AWS-S3).
Я долго искал в Google и нашел clowne_active_storage gem для управления клонами вложений ActiveStorage.
Но моя проблема в том, что когда я пытаюсь клонироватьнесколько объектов, клон работает хорошо для первого и не работает для других.
Моя модель пользователя:
class User < ApplicationRecord
MAX_FILE_SIZE = 30.megabytes
MAX_FILE_SIZE_HR = "30MB" #human readable
validate :validate_fields
has_one_attached :file_input
def has_attachment?
!self.file_input.attachment().nil?
end
private
def validate_fields
validate_file_size
end
def validate_file_size
if file_input.attached? && file_input.blob.byte_size > MAX_FILE_SIZE
file_input.purge
errors[:base] << ("File size should be less than " + MAX_FILE_SIZE_HR)
end
end
end
Мой код для клонирования нескольких объектов:
self.users.each { |user|
user_copy = UserCloner.call(user).to_record
user_copy.save!
}
Код моего класса UserCloner (с использованием clowne gem):
class UserCloner < Clowne::Cloner
adapter :active_record
include_attached :file_input
# on clone finalize (_source = user & record = user_copy)
finalize do |_source, record, params|
if _source.has_attachment?
# Clone attached file
record.file_input.attach(_source.file_input.blob)
end
end
end
Поэтому, когда я клонирую пользователей, file_input успешно клонируется для первого, но недля остальных.Используя отладчик, я вижу что-то странное: когда я проверяю file_input
для 1-го клонированного пользователя, у меня это Attachment.record
равно моему клонированному пользователю (с id = nil, потому что это до user_copy.save!):
<ActiveStorage::Attached::One:0x00005646cd9cc3f8 @name="file_input", @record=#<User id: nil...
, но для следующих клонированных пользователей Attachment.record
равно моему исходному пользователю (_source), а не user_copy:
<ActiveStorage::Attached::One:0x00005646cd9608d8 @name="file_input", @record=#<User id: 1...
Я понимаю, что проблема возникает здесь, но я могуНе понимаю, почему для 1-го клонированного пользователя запись вложения прикрепляется к клонированному пользователю, а для следующего - к исходному пользователю.
Если кто-то столкнулся с той же проблемой или у нее есть начало решения, я 'Я буду рад этому!
Большое спасибо за вашу помощь заранее,
Хорошего дня,
Pierre Avinain