123456789_123456789_123456789_123456789_123456789_

Class: ActiveStorage::Attached::Many

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Attached
Instance Chain:
self, Attached
Inherits: Attached
  • ::Object
Defined in: activestorage/lib/active_storage/attached/many.rb

Overview

==============================

Decorated proxy object representing of multiple attachments to a model.

Instance Attribute Summary

  • #attached? ⇒ Boolean readonly

    Returns true if any attachments have been made.

  • #detach readonly

    Deletes associated attachments without purging them, leaving their respective blobs in place.

  • #purge readonly

    Directly purges each associated attachment (i.e.

  • #purge_later readonly

    Purges each associated attachment through the queuing system.

Instance Method Summary

Instance Attribute Details

#attached? ⇒ Boolean (readonly)

Returns true if any attachments have been made.

class Gallery < ApplicationRecord
  has_many_attached :photos
end

{Gallery.new}.photos.attached? # => false
[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/many.rb', line 83

def attached?
  attachments.any?
end

#detach (readonly)

Deletes associated attachments without purging them, leaving their respective blobs in place.

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/many.rb', line 26

delegate :detach, to: :detach_many

#purge (readonly)

Directly purges each associated attachment (i.e. destroys the blobs and attachments and deletes the files on the service).

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/many.rb', line 14

delegate :purge, to: :purge_many

#purge_later (readonly)

Purges each associated attachment through the queuing system.

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/many.rb', line 20

delegate :purge_later, to: :purge_many

Instance Method Details

#as_json(options = nil)

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/many.rb', line 96

def as_json(options = nil)
  attachments.as_json(options)
end

#attach(*attachables)

Attaches one or more attachables to the record.

If the record is persisted and unchanged, the attachments are saved to the database immediately. Otherwise, they'll be saved to the DB when the record is next saved.

document.images.attach(params[:images]) # Array of {ActionDispatch::Http::UploadedFile} objects
document.images.attach(params[:signed_blob_id]) # Signed reference to blob from direct upload
document.images.attach(io: {File.open}("/path/to/racecar.jpg"), filename: "racecar.jpg", content_type: "image/jpeg")
document.images.attach([ first_blob, second_blob ])
[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/many.rb', line 54

def attach(*attachables)
  record.public_send("#{name}=", blobs + attachables.flatten)
  if record.persisted? && !record.changed?
    return if !record.save
  end
  record.public_send("#{name}")
end

#attach!(*attachables)

Calls attach, and raises an exception if the record was meant to be saved but at least one of the validations failed.

document.images.attach!(params[:images]) # Array of {ActionDispatch::Http::UploadedFile} objects
document.images.attach!(params[:signed_blob_id]) # Signed reference to blob from direct upload
document.images.attach!(io: {File.open}("/path/to/racecar.jpg"), filename: "racecar.jpg", content_type: "image/jpeg")
document.images.attach!([ first_blob, second_blob ])
[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/many.rb', line 70

def attach!(*attachables)
  attach(*attachables) || raise(ActiveRecord::RecordNotSaved.new("Failed to save the record", record))
end

#attachments

Returns all the associated attachment records.

All methods called on this proxy object that aren't listed here will automatically be delegated to attachments.

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/many.rb', line 33

def attachments
  change.present? ? change.attachments : record.public_send("#{name}_attachments")
end

#blobs

Returns all attached blobs.

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/many.rb', line 38

def blobs
  change.present? ? change.blobs : record.public_send("#{name}_blobs")
end

#byte_size

Returns the combined size in bytes of all attached blobs.

document.images.byte_size # => 2048
[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/many.rb', line 92

def byte_size
  blobs.pluck(:byte_size).sum
end

#detach_many (private)

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/many.rb', line 105

def detach_many
  Attached::Changes::DetachMany.new(name, record, attachments)
end

#purge_many (private)

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/many.rb', line 101

def purge_many
  Attached::Changes::PurgeMany.new(name, record, attachments)
end