aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation/finder_methods.rb
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2010-01-20 18:17:37 +0530
committerPratik Naik <pratiknaik@gmail.com>2010-01-20 18:17:37 +0530
commit2493229674ba2e8736901d44abe0c82e6ac82993 (patch)
tree78e6737f3611ead52daf8eac2141e8e71b6c8aa0 /activerecord/lib/active_record/relation/finder_methods.rb
parent8f0f02a1667d6a1c948d6c60adf9581ec47376b9 (diff)
downloadrails-2493229674ba2e8736901d44abe0c82e6ac82993.tar.gz
rails-2493229674ba2e8736901d44abe0c82e6ac82993.tar.bz2
rails-2493229674ba2e8736901d44abe0c82e6ac82993.zip
Delegate exists? to Relation
Diffstat (limited to 'activerecord/lib/active_record/relation/finder_methods.rb')
-rw-r--r--activerecord/lib/active_record/relation/finder_methods.rb36
1 files changed, 33 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/relation/finder_methods.rb b/activerecord/lib/active_record/relation/finder_methods.rb
index 999309d2bd..2e451e380b 100644
--- a/activerecord/lib/active_record/relation/finder_methods.rb
+++ b/activerecord/lib/active_record/relation/finder_methods.rb
@@ -119,10 +119,40 @@ module ActiveRecord
args.any? ? apply_finder_options(args.first).to_a : to_a
end
+ # Returns true if a record exists in the table that matches the +id+ or
+ # conditions given, or false otherwise. The argument can take five forms:
+ #
+ # * Integer - Finds the record with this primary key.
+ # * String - Finds the record with a primary key corresponding to this
+ # string (such as <tt>'5'</tt>).
+ # * Array - Finds the record that matches these +find+-style conditions
+ # (such as <tt>['color = ?', 'red']</tt>).
+ # * Hash - Finds the record that matches these +find+-style conditions
+ # (such as <tt>{:color => 'red'}</tt>).
+ # * No args - Returns false if the table is empty, true otherwise.
+ #
+ # For more information about specifying conditions as a Hash or Array,
+ # see the Conditions section in the introduction to ActiveRecord::Base.
+ #
+ # Note: You can't pass in a condition as a string (like <tt>name =
+ # 'Jamie'</tt>), since it would be sanitized and then queried against
+ # the primary key column, like <tt>id = 'name = \'Jamie\''</tt>.
+ #
+ # ==== Examples
+ # Person.exists?(5)
+ # Person.exists?('5')
+ # Person.exists?(:name => "David")
+ # Person.exists?(['name LIKE ?', "%#{query}%"])
+ # Person.exists?
def exists?(id = nil)
- relation = select(primary_key).limit(1)
- relation = relation.where(primary_key.eq(id)) if id
- relation.first ? true : false
+ case id
+ when Array, Hash
+ where(id).exists?
+ else
+ relation = select(primary_key).limit(1)
+ relation = relation.where(primary_key.eq(id)) if id
+ relation.first ? true : false
+ end
end
protected