mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
03afddd2eb
Consider the following model definitions: class User < ApplicationRecord has_one_attached :avatar end class Group < ApplicationRecord has_one_attached :avatar end If you attempt to reflect on the User model's avatar attachment via User.reflect_on_attachment, you could receive a reflection for the Group model's avatar attachment. Fix this by ensuring that each model class uses its own Hash object to track attachment reflections.
64 lines
1.8 KiB
Ruby
64 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module ActiveStorage
|
|
module Reflection
|
|
# Holds all the metadata about a has_one_attached attachment as it was
|
|
# specified in the Active Record class.
|
|
class HasOneAttachedReflection < ActiveRecord::Reflection::MacroReflection #:nodoc:
|
|
def macro
|
|
:has_one_attached
|
|
end
|
|
end
|
|
|
|
# Holds all the metadata about a has_many_attached attachment as it was
|
|
# specified in the Active Record class.
|
|
class HasManyAttachedReflection < ActiveRecord::Reflection::MacroReflection #:nodoc:
|
|
def macro
|
|
:has_many_attached
|
|
end
|
|
end
|
|
|
|
module ReflectionExtension # :nodoc:
|
|
def add_attachment_reflection(model, name, reflection)
|
|
model.attachment_reflections = model.attachment_reflections.merge(name.to_s => reflection)
|
|
end
|
|
|
|
private
|
|
def reflection_class_for(macro)
|
|
case macro
|
|
when :has_one_attached
|
|
HasOneAttachedReflection
|
|
when :has_many_attached
|
|
HasManyAttachedReflection
|
|
else
|
|
super
|
|
end
|
|
end
|
|
end
|
|
|
|
module ActiveRecordExtensions
|
|
extend ActiveSupport::Concern
|
|
|
|
included do
|
|
class_attribute :attachment_reflections, instance_writer: false, default: {}
|
|
end
|
|
|
|
module ClassMethods
|
|
# Returns an array of reflection objects for all the attachments in the
|
|
# class.
|
|
def reflect_on_all_attachments
|
|
attachment_reflections.values
|
|
end
|
|
|
|
# Returns the reflection object for the named +attachment+.
|
|
#
|
|
# User.reflect_on_attachment(:avatar)
|
|
# # => the avatar reflection
|
|
#
|
|
def reflect_on_attachment(attachment)
|
|
attachment_reflections[attachment.to_s]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|