AdamB
AdamB

Reputation: 3121

Rails .where vs .find

I've noticed that the Model.where method always returns an array even if there is only one result where as the Model.find method doesn't. Is there any reason for this? I thought Model.where was the preferred function since Rails 3.X.

Should I be using Model.find when I expect a single result and Model.where when I expect more than one result?

Upvotes: 78

Views: 73422

Answers (3)

Andrew Marshall
Andrew Marshall

Reputation: 96914

  • 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. If nothing is found, an ActiveRecord::RecordNotFound exception is raised (but not with the dynamic find_by_ methods).

    While find can return an Array of records—not a Relation—if given a list of IDs, using where is preferred since Rails 3. Many similar uses of find are now deprecated or gone entirely.

So yes, if you only want and expect a single object, using find is easier, as otherwise you must call Model.where.first.

Note that old-style hash options to find and many dynamic find_ methods are deprecated as of Rails 4.0 (see relevant release notes).

Upvotes: 123

Kamil Lelonek
Kamil Lelonek

Reputation: 14744

Actually find_by takes a model object from where obtained ActiveRecord::Relation

def find_by(*args)
  where(*args).take
end

Source

Upvotes: 14

iltempo
iltempo

Reputation: 16012

Model.find is using the primary key column. Therefore there is always exactly one or no result. Use it when you are looking for one specific element identified by it's id.

Upvotes: 7

Related Questions