aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGodfrey Chan <godfreykfc@gmail.com>2014-08-24 05:01:59 -0700
committerGodfrey Chan <godfreykfc@gmail.com>2014-08-25 17:48:34 -0700
commit37939e28c953ab526c3fc9637f0239b095db1f70 (patch)
tree51fd57af3d01214480e0c0fabe05b67c5097e2f1
parent58c5261efa6ca0134ebfac8a701915d5e36d2c25 (diff)
downloadrails-37939e28c953ab526c3fc9637f0239b095db1f70.tar.gz
rails-37939e28c953ab526c3fc9637f0239b095db1f70.tar.bz2
rails-37939e28c953ab526c3fc9637f0239b095db1f70.zip
Override #find_by! in core to enable AST caching
-rw-r--r--activerecord/lib/active_record/core.rb4
-rw-r--r--activerecord/test/cases/finder_test.rb22
2 files changed, 26 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb
index 2cbb8442a1..82b9c79533 100644
--- a/activerecord/lib/active_record/core.rb
+++ b/activerecord/lib/active_record/core.rb
@@ -177,6 +177,10 @@ module ActiveRecord
end
end
+ def find_by!(*args)
+ find_by(*args) or raise RecordNotFound
+ end
+
def initialize_generated_modules
super
diff --git a/activerecord/test/cases/finder_test.rb b/activerecord/test/cases/finder_test.rb
index 9129dbaf63..befbec4e1b 100644
--- a/activerecord/test/cases/finder_test.rb
+++ b/activerecord/test/cases/finder_test.rb
@@ -1047,6 +1047,28 @@ class FinderTest < ActiveRecord::TestCase
assert_sql(/^((?!ORDER).)*$/) { Post.find_by(id: posts(:eager_other).id) }
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! doesn't have implicit ordering" do
+ assert_sql(/^((?!ORDER).)*$/) { Post.find_by!(id: posts(:eager_other).id) }
+ end
+
+ test "find_by! raises RecordNotFound if the record is missing" do
+ assert_raises(ActiveRecord::RecordNotFound) do
+ Post.find_by!("1 = 0")
+ end
+ end
+
protected
def bind(statement, *vars)
if vars.first.is_a?(Hash)