'Find' returns single object to you as a result but 'Where' returns Array to you so you need to add .
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.
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.
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")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With