Spec-Zone.ru › Ruby on Rails 5.2

модуль ActiveStorage::Attached::Macros

Предоставляет DSL уровня класса для объявления, что модель Active Record имеет прикреплённые объекты blob.

Общедоступные методы экземпляра

has_many_attached(name, dependent: :purge_later) Показать исходный код
# File activestorage/lib/active_storage/attached/macros.rb, line 77
    def has_many_attached(name, dependent: :purge_later)
      class_eval <<-CODE, __FILE__, __LINE__ + 1
        def #{name}
          @active_storage_attached_#{name} ||= ActiveStorage::Attached::Many.new("#{name}", self, dependent: #{dependent == :purge_later ? ":purge_later" : "false"})
        end

        def #{name}=(attachables)
          #{name}.attach(attachables)
        end
      CODE

      has_many :"#{name}_attachments", -> { where(name: name) }, as: :record, class_name: "ActiveStorage::Attachment", inverse_of: :record, dependent: false do
        def purge
          each(&:purge)
          reset
        end

        def purge_later
          each(&:purge_later)
          reset
        end
      end
      has_many :"#{name}_blobs", through: :"#{name}_attachments", class_name: "ActiveStorage::Blob", source: :blob

      scope :"with_attached_#{name}", -> { includes("#{name}_attachments": :blob) }

      if dependent == :purge_later
        after_destroy_commit { public_send(name).purge_later }
      else
        before_destroy { public_send(name).detach }
      end
    end

Устанавливает отношение между множественными прикреплёнными файлами и моделью.

class Gallery < ActiveRecord::Base
  has_many_attached :photos
end

Столбцы на стороне модели не определены, Active Storage позаботится о сопоставлении между вашими записями и прикреплёнными файлами.

Чтобы избежать запросов N+1, вы можете включить прикреплённые blob в ваш запрос следующим образом:

Gallery.where(user: Current.user).with_attached_photos

Под капотом, это отношение реализовано как has_many ассоциация с записью ActiveStorage::Attachment и has_many-through ассоциация с записью ActiveStorage::Blob. Эти ассоциации доступны как photos_attachments и photos_blobs. Но вам, скорее всего, не придётся работать с этими ассоциациями напрямую.

Система разработана таким образом, чтобы вы взаимодействовали через прокси ActiveStorage::Attached::Many, который предоставляет динамический доступ к ассоциациям и фабричным методам, таким как #attach.

Если опция :dependent не установлена, все прикреплённые файлы будут удалены (т.е. уничтожены) при уничтожении записи.

has_one_attached(name, dependent: :purge_later) Показать исходный код
# File activestorage/lib/active_storage/attached/macros.rb, line 30
    def has_one_attached(name, dependent: :purge_later)
      class_eval <<-CODE, __FILE__, __LINE__ + 1
        def #{name}
          @active_storage_attached_#{name} ||= ActiveStorage::Attached::One.new("#{name}", self, dependent: #{dependent == :purge_later ? ":purge_later" : "false"})
        end

        def #{name}=(attachable)
          #{name}.attach(attachable)
        end
      CODE

      has_one :"#{name}_attachment", -> { where(name: name) }, class_name: "ActiveStorage::Attachment", as: :record, inverse_of: :record, dependent: false
      has_one :"#{name}_blob", through: :"#{name}_attachment", class_name: "ActiveStorage::Blob", source: :blob

      scope :"with_attached_#{name}", -> { includes("#{name}_attachment": :blob) }

      if dependent == :purge_later
        after_destroy_commit { public_send(name).purge_later }
      else
        before_destroy { public_send(name).detach }
      end
    end

Устанавливает отношение между одним прикреплённым файлом и моделью.

class User < ActiveRecord::Base
  has_one_attached :avatar
end

Столбец на стороне модели не определён, Active Storage позаботится о сопоставлении между вашими записями и прикреплённым файлом.

Чтобы избежать запросов N+1, вы можете включить прикреплённый blob в ваш запрос так:

User.with_attached_avatar

Под капотом, это отношение реализовано как has_one ассоциация с записью ActiveStorage::Attachment и has_one-through ассоциация с записью ActiveStorage::Blob. Эти ассоциации доступны как avatar_attachment и avatar_blob. Но вам, скорее всего, не придётся работать с этими ассоциациями напрямую.

Система разработана таким образом, чтобы вы работали через прокси ActiveStorage::Attached::One, который предоставляет динамический доступ к ассоциациям и фабричным методам, таким как attach.

Если опция :dependent не установлена, прикреплённый файл будет удалён (т.е. уничтожен) при уничтожении записи.

purge() Показать исходный код
# File activestorage/lib/active_storage/attached/macros.rb, line 89
def purge
  each(&:purge)
  reset
end
purge_later() Показать исходный код
# File activestorage/lib/active_storage/attached/macros.rb, line 94
def purge_later
  each(&:purge_later)
  reset
end

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API