mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Refactoring .reflections public method.
Now the internal reflections will hold a reference to its public representation, so when the outside world calls `Account.reflection` we can build a list of public reflections.
This commit is contained in:
parent
6259e4e2dc
commit
00b024218f
4 changed files with 28 additions and 9 deletions
|
@ -1577,6 +1577,8 @@ module ActiveRecord
|
||||||
scope = nil
|
scope = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
habtm_reflection = ActiveRecord::Reflection::AssociationReflection.new(:has_and_belongs_to_many, name, scope, options, self)
|
||||||
|
|
||||||
builder = Builder::HasAndBelongsToMany.new name, self, options
|
builder = Builder::HasAndBelongsToMany.new name, self, options
|
||||||
|
|
||||||
join_model = builder.through_model
|
join_model = builder.through_model
|
||||||
|
@ -1590,6 +1592,7 @@ module ActiveRecord
|
||||||
|
|
||||||
Builder::HasMany.define_callbacks self, middle_reflection
|
Builder::HasMany.define_callbacks self, middle_reflection
|
||||||
Reflection.add_reflection self, middle_reflection.name, middle_reflection
|
Reflection.add_reflection self, middle_reflection.name, middle_reflection
|
||||||
|
middle_reflection.parent_reflection = [name.to_s, habtm_reflection]
|
||||||
|
|
||||||
include Module.new {
|
include Module.new {
|
||||||
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
||||||
|
@ -1610,9 +1613,7 @@ module ActiveRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
has_many name, scope, hm_options, &extension
|
has_many name, scope, hm_options, &extension
|
||||||
|
self._reflections[name.to_s].parent_reflection = [name.to_s, habtm_reflection]
|
||||||
reflection = ActiveRecord::Reflection::AssociationReflection.new(:has_and_belongs_to_many, name, scope, options, self)
|
|
||||||
self.reflections = self.reflections.except(middle_reflection.name).merge!(name.to_s => reflection)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -166,7 +166,7 @@ module ActiveRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def each_counter_cached_associations
|
def each_counter_cached_associations
|
||||||
reflections.each do |name, reflection|
|
_reflections.each do |name, reflection|
|
||||||
yield association(name) if reflection.belongs_to? && reflection.counter_cache_column
|
yield association(name) if reflection.belongs_to? && reflection.counter_cache_column
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -307,7 +307,6 @@ module ActiveRecord
|
||||||
attr_names.each do |association_name|
|
attr_names.each do |association_name|
|
||||||
if reflection = _reflect_on_association(association_name)
|
if reflection = _reflect_on_association(association_name)
|
||||||
reflection.autosave = true
|
reflection.autosave = true
|
||||||
reflect_on_association(association_name).autosave = true
|
|
||||||
add_autosave_association_callbacks(reflection)
|
add_autosave_association_callbacks(reflection)
|
||||||
|
|
||||||
nested_attributes_options = self.nested_attributes_options.dup
|
nested_attributes_options = self.nested_attributes_options.dup
|
||||||
|
|
|
@ -7,11 +7,8 @@ module ActiveRecord
|
||||||
|
|
||||||
included do
|
included do
|
||||||
class_attribute :_reflections
|
class_attribute :_reflections
|
||||||
# @api public
|
|
||||||
class_attribute :reflections
|
|
||||||
class_attribute :aggregate_reflections
|
class_attribute :aggregate_reflections
|
||||||
self._reflections = {}
|
self._reflections = {}
|
||||||
self.reflections = {}
|
|
||||||
self.aggregate_reflections = {}
|
self.aggregate_reflections = {}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -28,7 +25,6 @@ module ActiveRecord
|
||||||
|
|
||||||
def self.add_reflection(ar, name, reflection)
|
def self.add_reflection(ar, name, reflection)
|
||||||
ar._reflections = ar._reflections.merge(name.to_s => reflection)
|
ar._reflections = ar._reflections.merge(name.to_s => reflection)
|
||||||
ar.reflections = ar.reflections.merge(name.to_s => reflection)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.add_aggregate_reflection(ar, name, reflection)
|
def self.add_aggregate_reflection(ar, name, reflection)
|
||||||
|
@ -57,6 +53,24 @@ module ActiveRecord
|
||||||
aggregate_reflections[aggregation.to_s]
|
aggregate_reflections[aggregation.to_s]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns a Hash of name of the reflection as the key and a AssociationReflection as the value.
|
||||||
|
#
|
||||||
|
# Account.reflections # => {balance: AggregateReflection}
|
||||||
|
#
|
||||||
|
# @api public
|
||||||
|
def reflections
|
||||||
|
ref = {}
|
||||||
|
_reflections.each do |name, reflection|
|
||||||
|
parent_name, parent_reflection = reflection.parent_reflection
|
||||||
|
if parent_name
|
||||||
|
ref[parent_name] = parent_reflection
|
||||||
|
else
|
||||||
|
ref[name] = reflection
|
||||||
|
end
|
||||||
|
end
|
||||||
|
ref
|
||||||
|
end
|
||||||
|
|
||||||
# Returns an array of AssociationReflection objects for all the
|
# Returns an array of AssociationReflection objects for all the
|
||||||
# associations in the class. If you only want to reflect on a certain
|
# associations in the class. If you only want to reflect on a certain
|
||||||
# association type, pass in the symbol (<tt>:has_many</tt>, <tt>:has_one</tt>,
|
# association type, pass in the symbol (<tt>:has_many</tt>, <tt>:has_one</tt>,
|
||||||
|
@ -142,6 +156,10 @@ module ActiveRecord
|
||||||
def autosave=(autosave)
|
def autosave=(autosave)
|
||||||
@automatic_inverse_of = false
|
@automatic_inverse_of = false
|
||||||
@options[:autosave] = autosave
|
@options[:autosave] = autosave
|
||||||
|
_, parent_reflection = self.parent_reflection
|
||||||
|
if parent_reflection
|
||||||
|
parent_reflection.autosave = autosave
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the class for the macro.
|
# Returns the class for the macro.
|
||||||
|
@ -206,6 +224,7 @@ module ActiveRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
attr_reader :type, :foreign_type
|
attr_reader :type, :foreign_type
|
||||||
|
attr_accessor :parent_reflection # [:name, Reflection]
|
||||||
|
|
||||||
def initialize(macro, name, scope, options, active_record)
|
def initialize(macro, name, scope, options, active_record)
|
||||||
super
|
super
|
||||||
|
|
Loading…
Reference in a new issue