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

后端 未结 4 739
余生分开走
余生分开走 2020-12-14 00:01

What\'s the difference between find, where and find_by_id? They all work when you try to find a user given an ID.

相关标签:
4条回答
  • 2020-12-14 00:08

    Simple to me....

    'Find' returns single object to you as a result but 'Where' returns Array to you so you need to add .each to fetch each object from that array.

    0 讨论(0)
  • 2020-12-14 00:09

    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
    
    0 讨论(0)
  • 2020-12-14 00:23

    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")
    
    0 讨论(0)
  • 2020-12-14 00:28

    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
    
    0 讨论(0)
提交回复
热议问题