Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the difference between find, where and find_by_id?

People also ask

What is difference between find and where?

'Find' returns single object to you as a result but 'Where' returns Array to you so you need to add .

What is the difference between find and Find_by?

The additional difference between find() and find_by() is that find could only be used to search by primary key (usually the 'id') while the find_by() requires and searches by attribute (either passed as hash like Employee. find_by(name: 'Mike') or using the Employee.

What is Find_by?

find_by is very similar to Model. find and lets you search any column or group of columns in your database but it returns nil if no record matches the search.

What does where return in rails?

where returns an ActiveRecord::Relation (not an array, even though it behaves much like one), which is a collection of model objects. If nothing matches the conditions, it simply returns an empty relation. find (and its related dynamic find_by_columnname methods) returns a single model object.


The difference is what they return when a record is found, or when it's not found. Consider the following examples:

>> User.create name: 'THE USER' # creates a user with id = 1
>> User.find(1) # returns the user
>> User.find_by_id(1) # returns the user
>> User.where(id: 1).first # returns the user

As you can see, an existing user can be fetched using any of the 3 methods. The big difference with using where is you can chain commands (of course, without calling first first.)

Let's have a look at when you try to find a record that isn't existing

>> User.find(2) # raises an exception
>> User.find_by_id(2) # nil
>> User.where(id: 2).first # nil

So here, it's obvious that when you use find to search for a record that isn't existing, you get an exception. That exception is ActiveRecord::RecordNotFound which renders a 404 on production environment.

Hope this helps!

UPDATE

Rails 4 uses the following syntax for find_by

>> User.find_by(id: 1)  # returns nil if there's no user with an id of 1
>> User.find_by!(id: 1) # raises ActiveRecord::RecordNotFound when no record is found

find => This return single record if the given primary_key(id) exists in the system otherwise in will give an error.

Model.find(required_id_value)

find_by => This will return single record depends on the given attribute, and if the value of the attribute is not exist in the DB it will return nil.

Model.find_by_name("your name")

name here is the attribute and it must be exist in your Modal.

where => This will return an active record relation with zero or more records you need to use first to return only one record or nil in case zero records return.

Model.where(id: id_value).first

find => this is used to find row by id. This will return single record.

YourModel.find(2)
Address.find(1)

find_by => this is used to get row by any attributes of record. This will return first matching record if condition matches.

YourModel.find_by_attrname("value")
Address.find_by_street_name_and_city("Andheri", "Newyork")
Addess.find_by_id(4)

where => this is used get active records based on conditions to return active record relation (i.e.) may be zero or more records.

YourModel.where(:attrname => "something")
Address.where(:city => "Newyork")