LoginSignup
2
0

ActiveStorageの合計サイズのバリデーションをかけるには?

Posted at

複数のActiveStorage とモデルを紐づける has_many_attached :files フィールドの合計サイズでバリデーションをかけるのにはまりました。

削除フラグに対応した以下のようなフィールドを定義しているケースです

some_model.rb
  has_many_attached :files
  accepts_nested_attributes_for :files_attachments, allow_destroy: true

以下のように書いてませんか?

安心してくださいうまく動きません。
削除予定のファイルも含めてサイズが計算されてしまいます。

some_model.rb
  validate :validate_total_attachments_size
  def validate_total_attachments_size
    total_size = 0

    files.each do |file|
      total_size += file.byte_size
    end

    return unless total_size > 8.megabytes

    errors.add(:base, "合計サイズ#{
    number_with_delimiter(total_size)}Bを8MB(#{number_with_delimiter(8.megabytes)}B)以内にしてください")
  end

削除済みを除外して容量を計算

以下のように書いてください。

some_model.rb
  validate :validate_total_attachments_size
  def validate_total_attachments_size
    total_size = 0
    total_size += skill_sheet.byte_size if skill_sheet.present? && skill_sheet.attached?

    to_delete = []
    files_attachments.map do |file|
      to_delete << file.id if file.marked_for_destruction?
    end

    files.each do |file|
      total_size += file.byte_size unless to_delete.include?(file.id)
    end

    return unless total_size > 8.megabytes

    errors.add(:base, "合計サイズ#{
    number_with_delimiter(total_size)}Bを8MB(#{number_with_delimiter(8.megabytes)}B)以内にしてください")
  end
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0