aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/lib/active_record/reflection.rb46
-rw-r--r--activestorage/lib/active_storage/engine.rb9
-rw-r--r--activestorage/lib/active_storage/reflection.rb63
-rw-r--r--activestorage/test/models/reflection_test.rb4
4 files changed, 76 insertions, 46 deletions
diff --git a/activerecord/lib/active_record/reflection.rb b/activerecord/lib/active_record/reflection.rb
index 231c785a30..c47e0dc03c 100644
--- a/activerecord/lib/active_record/reflection.rb
+++ b/activerecord/lib/active_record/reflection.rb
@@ -11,7 +11,6 @@ module ActiveRecord
included do
class_attribute :_reflections, instance_writer: false, default: {}
class_attribute :aggregate_reflections, instance_writer: false, default: {}
- class_attribute :attachment_reflections, instance_writer: false, default: {}
end
def self.create(macro, name, scope, options, ar)
@@ -29,10 +28,6 @@ module ActiveRecord
HasOneReflection
when :belongs_to
BelongsToReflection
- when :has_one_attached
- HasOneAttachedReflection
- when :has_many_attached
- HasManyAttachedReflection
else
raise "Unsupported Macro: #{macro}"
end
@@ -48,18 +43,14 @@ module ActiveRecord
ar.aggregate_reflections = ar.aggregate_reflections.merge(name.to_s => reflection)
end
- def self.add_attachment_reflection(ar, name, reflection)
- ar.attachment_reflections.merge!(name.to_s => reflection)
- end
-
# \Reflection enables the ability to examine the associations and aggregations of
# Active Record classes and objects. This information, for example,
# can be used in a form builder that takes an Active Record object
# and creates input fields for all of the attributes depending on their type
# and displays the associations to other objects.
#
- # MacroReflection class has info for the AggregateReflection and
- # AssociationReflection classes.
+ # MacroReflection class has info for AggregateReflection and AssociationReflection
+ # classes.
module ClassMethods
# Returns an array of AggregateReflection objects for all the aggregations in the class.
def reflect_on_all_aggregations
@@ -74,21 +65,6 @@ module ActiveRecord
aggregate_reflections[aggregation.to_s]
end
- # 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
-
# Returns a Hash of name of the reflection as the key and an AssociationReflection as the value.
#
# Account.reflections # => {"balance" => AggregateReflection}
@@ -161,8 +137,6 @@ module ActiveRecord
# HasOneReflection
# BelongsToReflection
# HasAndBelongsToManyReflection
- # HasOneAttachedReflection
- # HasManyAttachedReflection
# ThroughReflection
# PolymorphicReflection
# RuntimeReflection
@@ -439,22 +413,6 @@ module ActiveRecord
end
end
- # Holds all the metadata about a has_one_attached attachment as it was
- # specified in the Active Record class.
- class HasOneAttachedReflection < 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 < MacroReflection #:nodoc:
- def macro
- :has_many_attached
- end
- end
-
# Holds all the metadata about an association as it was specified in the
# Active Record class.
class AssociationReflection < MacroReflection #:nodoc:
diff --git a/activestorage/lib/active_storage/engine.rb b/activestorage/lib/active_storage/engine.rb
index 99588cdd4b..519b9ae283 100644
--- a/activestorage/lib/active_storage/engine.rb
+++ b/activestorage/lib/active_storage/engine.rb
@@ -10,6 +10,8 @@ require "active_storage/previewer/video_previewer"
require "active_storage/analyzer/image_analyzer"
require "active_storage/analyzer/video_analyzer"
+require "active_storage/reflection"
+
module ActiveStorage
class Engine < Rails::Engine # :nodoc:
isolate_namespace ActiveStorage
@@ -95,5 +97,12 @@ module ActiveStorage
end
end
end
+
+ initializer "active_storage.reflection" do
+ ActiveSupport.on_load(:active_record) do
+ include Reflection::ActiveRecordExtensions
+ ActiveRecord::Reflection.singleton_class.prepend(Reflection::ReflectionExtension)
+ end
+ end
end
end
diff --git a/activestorage/lib/active_storage/reflection.rb b/activestorage/lib/active_storage/reflection.rb
new file mode 100644
index 0000000000..9074b20126
--- /dev/null
+++ b/activestorage/lib/active_storage/reflection.rb
@@ -0,0 +1,63 @@
+# 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
+ def reflection_class_for(macro)
+ case macro
+ when :has_one_attached
+ HasOneAttachedReflection
+ when :has_many_attached
+ HasManyAttachedReflection
+ else
+ super
+ end
+ end
+
+ def add_attachment_reflection(ar, name, reflection)
+ ar.attachment_reflections.merge!(name.to_s => reflection)
+ 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
diff --git a/activestorage/test/models/reflection_test.rb b/activestorage/test/models/reflection_test.rb
index 1ddfafc0f0..da866ca996 100644
--- a/activestorage/test/models/reflection_test.rb
+++ b/activestorage/test/models/reflection_test.rb
@@ -6,8 +6,8 @@ class ActiveStorage::ReflectionTest < ActiveSupport::TestCase
test "allows reflecting for all attachment" do
expected_classes =
User.reflect_on_all_attachments.all? do |reflection|
- reflection.is_a?(ActiveRecord::Reflection::HasOneAttachedReflection) ||
- reflection.is_a?(ActiveRecord::Reflection::HasManyAttachedReflection)
+ reflection.is_a?(ActiveStorage::Reflection::HasOneAttachedReflection) ||
+ reflection.is_a?(ActiveStorage::Reflection::HasManyAttachedReflection)
end
assert expected_classes