Class: ActiveStorage::Attachment

Inherits:
Record
  • Object
show all
Defined in:
app/models/active_storage/attachment.rb

Overview

Attachments associate records with blobs. Usually that's a one record-many blobs relationship, but it is possible to associate many different records with the same blob. A foreign-key constraint on the attachments table prevents blobs from being purged if they’re still attached to any records.

Attachments also have access to all methods from ActiveStorage::Blob.

If you wish to preload attachments or blobs, you can use these scopes:

# preloads attachments, their corresponding blobs, and variant records (if using `ActiveStorage.track_variants`)
User.all.with_attached_avatars

# preloads blobs and variant records (if using `ActiveStorage.track_variants`)
User.first.avatars.with_all_variant_records

Instance Method Summary collapse

Instance Method Details

#purgeObject

Synchronously deletes the attachment and purges the blob.



33
34
35
36
37
38
39
# File 'app/models/active_storage/attachment.rb', line 33

def purge
  transaction do
    delete
    record.touch if record&.persisted?
  end
  blob&.purge
end

#purge_laterObject

Deletes the attachment and enqueues a background job to purge the blob.



42
43
44
45
46
47
48
# File 'app/models/active_storage/attachment.rb', line 42

def purge_later
  transaction do
    delete
    record.touch if record&.persisted?
  end
  blob&.purge_later
end

#variant(transformations) ⇒ Object

Returns an ActiveStorage::Variant or ActiveStorage::VariantWithRecord instance for the attachment with the set of transformations provided. See ActiveStorage::Blob::Representable#variant for more information.

Raises an ArgumentError if transformations is a Symbol which is an unknown pre-defined variant of the attachment.



56
57
58
59
60
61
62
63
64
65
66
67
# File 'app/models/active_storage/attachment.rb', line 56

def variant(transformations)
  case transformations
  when Symbol
    variant_name = transformations
    transformations = variants.fetch(variant_name) do
      record_model_name = record.to_model.model_name.name
      raise ArgumentError, "Cannot find variant :#{variant_name} for #{record_model_name}##{name}"
    end
  end

  blob.variant(transformations)
end