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

Fixed find_by("sql fragment without bindings") on master

* Also duplicated find_by tests from relations_test.rb to finder_test.rb now
	that we have a completely different implementation on the class (in core.rb
	with AST caching stuff).

* Also removed a (failing) test that used mocks. Now that we have tests for the
  behavior, there's no point having another test that tests the implementation
	(that it delegates). Further, what the test was implying is nolonger true with
	the current implementation, because Class.find_by is a real method now.
This commit is contained in:
Godfrey Chan 2014-08-24 04:42:12 -07:00
parent 3041b0b203
commit 58c5261efa
4 changed files with 23 additions and 17 deletions

View file

@ -151,7 +151,7 @@ module ActiveRecord
end
def find_by(*args)
return super if current_scope || args.length > 1 || reflect_on_all_aggregations.any?
return super if current_scope || !(Hash === args.first) || reflect_on_all_aggregations.any?
hash = args.first

View file

@ -1540,20 +1540,6 @@ class BasicsTest < ActiveRecord::TestCase
assert_equal "", Company.new.description
end
["find_by", "find_by!"].each do |meth|
test "#{meth} delegates to scoped" do
record = stub
scope = mock
scope.expects(meth).with(:foo, :bar).returns(record)
klass = Class.new(ActiveRecord::Base)
klass.stubs(:all => scope)
assert_equal record, klass.public_send(meth, :foo, :bar)
end
end
test "scoped can take a values hash" do
klass = Class.new(ActiveRecord::Base)
assert_equal ['foo'], klass.all.merge!(select: 'foo').select_values

View file

@ -1027,6 +1027,26 @@ class FinderTest < ActiveRecord::TestCase
assert_nothing_raised(ActiveRecord::StatementInvalid) { Topic.offset("3").to_a }
end
test "find_by with hash conditions returns the first matching record" do
assert_equal posts(:eager_other), Post.find_by(id: posts(:eager_other).id)
end
test "find_by with non-hash conditions returns the first matching record" do
assert_equal posts(:eager_other), Post.find_by("id = #{posts(:eager_other).id}")
end
test "find_by with multi-arg conditions returns the first matching record" do
assert_equal posts(:eager_other), Post.find_by('id = ?', posts(:eager_other).id)
end
test "find_by returns nil if the record is missing" do
assert_equal nil, Post.find_by("1 = 0")
end
test "find_by doesn't have implicit ordering" do
assert_sql(/^((?!ORDER).)*$/) { Post.find_by(id: posts(:eager_other).id) }
end
protected
def bind(statement, *vars)
if vars.first.is_a?(Hash)

View file

@ -1570,7 +1570,7 @@ class RelationTest < ActiveRecord::TestCase
end
test "find_by doesn't have implicit ordering" do
assert_sql(/^((?!ORDER).)*$/) { Post.find_by(author_id: 2) }
assert_sql(/^((?!ORDER).)*$/) { Post.all.find_by(author_id: 2) }
end
test "find_by! with hash conditions returns the first matching record" do
@ -1586,7 +1586,7 @@ class RelationTest < ActiveRecord::TestCase
end
test "find_by! doesn't have implicit ordering" do
assert_sql(/^((?!ORDER).)*$/) { Post.find_by!(author_id: 2) }
assert_sql(/^((?!ORDER).)*$/) { Post.all.find_by!(author_id: 2) }
end
test "find_by! raises RecordNotFound if the record is missing" do