Ruby on Rails 5.2 - ActiveStorage::Attached::Macros

मॉड्यूल ActiveStorage :: संलग्न :: मैक्रोज़




ruby

मॉड्यूल ActiveStorage :: संलग्न :: मैक्रोज़

यह घोषित करने के लिए क्लास-स्तर के डीएसएल प्रदान करता है कि एक सक्रिय रिकॉर्ड मॉडल ने ब्लब्स संलग्न किया है।

सार्वजनिक प्रवृत्ति के तरीके

has_many_attached (नाम, आश्रित:: 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

मॉडल पक्ष पर कोई स्तंभ परिभाषित नहीं हैं, सक्रिय संग्रहण आपके रिकॉर्ड और अनुलग्नकों के बीच मैपिंग का ध्यान रखता है।

एन + 1 प्रश्नों से बचने के लिए, आप अपनी क्वेरी में संलग्न ब्लॉब्स को शामिल कर सकते हैं जैसे:

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

कवर के तहत, इस संबंध को has_many एसोसिएशन के रूप में एक ActiveStorage::Attachment record और has_many-through ActiveStorage::Blob record के रूप में लागू किया गया है। ये एसोसिएशन photos_attachments और photos_blobs रूप में उपलब्ध हैं। लेकिन आपको ज्यादातर परिस्थितियों में सीधे इन संघों के साथ काम करने की आवश्यकता नहीं होनी चाहिए।

सिस्टम को आपके द्वारा ActiveStorage::Attached::Many माध्यम से जाने के लिए डिज़ाइन किया गया है ActiveStorage::Attached::Many प्रॉक्सी जो #attach जैसे संघों और कारखाने के तरीकों को गतिशील प्रॉक्सी प्रदान करते हैं।

यदि :dependent विकल्प सेट नहीं किया गया है, तो जब भी रिकॉर्ड नष्ट हो जाता है, तो सभी अटैचमेंट (यानी नष्ट) हो जाएंगे।

has_one_attached (नाम, आश्रित:: 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

मॉडल पक्ष पर कोई स्तंभ परिभाषित नहीं है, सक्रिय संग्रहण आपके रिकॉर्ड और अनुलग्नक के बीच मैपिंग का ध्यान रखता है।

एन + 1 प्रश्नों से बचने के लिए, आप अपनी क्वेरी में संलग्न ब्लॉब्स को शामिल कर सकते हैं जैसे:

User.with_attached_avatar

कवर के तहत, इस संबंध को has_one एसोसिएशन के रूप में एक ActiveStorage::Attachment रिकॉर्ड और has_one-through संगति ActiveStorage::Blob record के रूप में लागू किया गया है। ये संघ 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