Skip to content

Commit

Permalink
reduce automatic_inverse_of caching logic
Browse files Browse the repository at this point in the history
  • Loading branch information
tenderlove committed Jun 13, 2013
1 parent 5d46c57 commit f379185
Showing 1 changed file with 16 additions and 30 deletions.
46 changes: 16 additions & 30 deletions activerecord/lib/active_record/reflection.rb
Expand Up @@ -296,15 +296,13 @@ def scope_chain
alias :source_macro :macro alias :source_macro :macro


def has_inverse? def has_inverse?
@options[:inverse_of] || find_inverse_of_automatically inverse_name
end end


def inverse_of def inverse_of
@inverse_of ||= if options[:inverse_of] return unless inverse_name
klass.reflect_on_association(options[:inverse_of])
else @inverse_of ||= klass.reflect_on_association inverse_name
find_inverse_of_automatically
end
end end


# Clears the cached value of +@inverse_of+ on this object. This will # Clears the cached value of +@inverse_of+ on this object. This will
Expand Down Expand Up @@ -393,26 +391,21 @@ def polymorphic?
INVALID_AUTOMATIC_INVERSE_OPTIONS = [:conditions, :through, :polymorphic, :foreign_key] INVALID_AUTOMATIC_INVERSE_OPTIONS = [:conditions, :through, :polymorphic, :foreign_key]


private private
# Attempts to find the inverse association automatically. # Attempts to find the inverse association name automatically.
# If it cannot find a suitable inverse association, it returns # If it cannot find a suitable inverse association name, it returns
# nil. # nil.
def find_inverse_of_automatically def inverse_name
if @automatic_inverse_of == false options.fetch(:inverse_of) do
nil if @automatic_inverse_of == false
elsif @automatic_inverse_of.nil? nil
set_automatic_inverse_of else
else @automatic_inverse_of = automatic_inverse_of
klass.reflect_on_association(@automatic_inverse_of) end
end end
end end


# Sets the +@automatic_inverse_of+ instance variable, and returns # returns either nil or the inverse association name that it finds.
# either nil or the inverse association that it finds. def automatic_inverse_of
#
# This method caches the inverse association that is found so that
# future calls to +find_inverse_of_automatically+ have much less
# overhead.
def set_automatic_inverse_of
if can_find_inverse_of_automatically?(self) if can_find_inverse_of_automatically?(self)
inverse_name = active_record.name.downcase.to_sym inverse_name = active_record.name.downcase.to_sym


Expand All @@ -425,15 +418,8 @@ def set_automatic_inverse_of
end end


if valid_inverse_reflection?(reflection) if valid_inverse_reflection?(reflection)
@automatic_inverse_of = inverse_name inverse_name
reflection
else
@automatic_inverse_of = false
nil
end end
else
@automatic_inverse_of = false
nil
end end
end end


Expand Down

0 comments on commit f379185

Please sign in to comment.