method

exists?

rails latest stable - Class: ActiveRecord::Base

Method deprecated or moved

This method is deprecated or moved on the latest stable version. The last existing version (v2.3.8) is shown here.

exists?(id_or_conditions = {})
public

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 '5').
  • Array - Finds the record that matches these find-style conditions (such as ['color = ?', 'red']).
  • Hash - Finds the record that matches these find-style conditions (such as {:color => 'red'}).
  • 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 name = 'Jamie'), since it would be sanitized and then queried against the primary key column, like id = 'name = \'Jamie\''.

Examples

  Person.exists?(5)
  Person.exists?('5')
  Person.exists?(:name => "David")
  Person.exists?(['name LIKE ?', "%#{query}%"])
  Person.exists?

3Notes

Possible gotcha

szeryf · Feb 3, 20093 thanks

Please note that +exists?+ doesn't hold all the conventions of +find+, i.e. you can't do:

Person.exists?(:conditions => ['name LIKE ?', "%#{query}%"]) # DOESN'T WORK!

Dynamic exists? methods

szeryf · Apr 22, 20102 thanks

There are no dynamic exists? methods analogous to dynamic finders, which means that while you can do this:

Person.find_by_name('David')

you can't do this:

Person.exists_by_name('David') # DOES NOT WORK

nor this:

Person.exists_by_name?('David') # DOES NOT WORK

However, you can simulate this with dynamic scope:

Person.scoped_by_name('David').exists?

You'll have to admit that this is so much better than the plain old method:

Person.exists?(:name => "David")

takes ActiveRecord object as an arg as well

carpeliam · Sep 8, 20102 thanks

One undocumented feature, you can do this: person = Person.first Person.exists?(person) # => returns true This came in handy for me when I needed to see if something belonged to a particular scope.

scope = "created_rails"
person = Person.find_by_name "dhh"
Person.send(scope).exists?(person)
# => returns true

Obviously this relies on you having a named_scope in your Person model called "created_rails".