複数の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