Приложение клона ActiveStorage - PullRequest
1 голос
/ 20 сентября 2019

Я работаю над проектом 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

...