1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

automatically add references when we can

This commit is contained in:
Jon Leighton 2012-01-14 17:53:52 +00:00
parent 4429f16c0a
commit ee7f666035
3 changed files with 29 additions and 1 deletions

View file

@ -21,6 +21,18 @@ module ActiveRecord
predicates.flatten predicates.flatten
end end
def self.references(attributes)
references = attributes.map do |key, value|
if value.is_a?(Hash)
key
else
key = key.to_s
key.split('.').first.to_sym if key.include?('.')
end
end
references.compact
end
private private
def self.build(attribute, value) def self.build(attribute, value)
case value case value

View file

@ -52,7 +52,7 @@ module ActiveRecord
return self if args.blank? return self if args.blank?
relation = clone relation = clone
relation.references_values = (references_values + args).uniq relation.references_values = (references_values + args).flatten.uniq
relation relation
end end
@ -151,6 +151,7 @@ module ActiveRecord
return self if opts.blank? return self if opts.blank?
relation = clone relation = clone
relation = relation.references(PredicateBuilder.references(opts)) if Hash === opts
relation.where_values += build_where(opts, rest) relation.where_values += build_where(opts, rest)
relation relation
end end
@ -159,6 +160,7 @@ module ActiveRecord
return self if opts.blank? return self if opts.blank?
relation = clone relation = clone
relation = relation.references(PredicateBuilder.references(opts)) if Hash === opts
relation.having_values += build_where(opts, rest) relation.having_values += build_where(opts, rest)
relation relation
end end

View file

@ -1175,4 +1175,18 @@ class RelationTest < ActiveRecord::TestCase
scope = Post.references(:comments) scope = Post.references(:comments)
assert !scope.eager_loading? assert !scope.eager_loading?
end end
def test_automatically_added_references
scope = Post.where(:comments => { :body => "Bla" })
assert_equal [:comments], scope.references_values
scope = Post.where('comments.body' => 'Bla')
assert_equal [:comments], scope.references_values
scope = Post.having(:comments => { :body => "Bla" })
assert_equal [:comments], scope.references_values
scope = Post.having('comments.body' => 'Bla')
assert_equal [:comments], scope.references_values
end
end end