модуль ActiveStorage::Attached::Macros
Предоставляет DSL уровня класса для объявления, что модель Active Record имеет прикреплённые объекты blob.
Общедоступные методы экземпляра
# 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 не установлена, все прикреплённые файлы будут удалены (т.е. уничтожены) при уничтожении записи.
# 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 не установлена, прикреплённый файл будет удалён (т.е. уничтожен) при уничтожении записи.
# File activestorage/lib/active_storage/attached/macros.rb, line 89 def purge each(&:purge) reset end
# 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.