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
Original file line number Diff line number Diff line change
Expand Up @@ -296,15 +296,13 @@ def scope_chain
alias :source_macro :macro

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

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

@inverse_of ||= klass.reflect_on_association inverse_name
end

# 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]

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

# Sets the +@automatic_inverse_of+ instance variable, and returns
# either nil or the inverse association that it finds.
#
# 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
# returns either nil or the inverse association name that it finds.
def automatic_inverse_of
if can_find_inverse_of_automatically?(self)
inverse_name = active_record.name.downcase.to_sym

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

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

Expand Down

0 comments on commit f379185

Please sign in to comment.