find
- 1.0.0
- 1.1.6
- 1.2.6
- 2.0.3
- 2.1.0
- 2.2.1
- 2.3.8
- 3.0.0 (0)
- 3.0.9 (-4)
- 3.1.0 (0)
- 3.2.1 (0)
- 3.2.8 (0)
- 3.2.13 (0)
- 4.0.2 (-38)
- 4.1.8 (13)
- 4.2.1 (0)
- 4.2.7 (0)
- 4.2.9 (0)
- 5.0.0.1 (-2)
- 5.1.7 (0)
- 5.2.3 (1)
- 6.0.0 (0)
- 6.1.3.1 (0)
- 6.1.7.7 (0)
- 7.0.0 (0)
- 7.1.3.2 (10)
- 7.1.3.4 (0)
- What's this?
find(*args)
public
Find by id - This can either be a specific id (ID), a list of ids (ID, ID, ID), or an array of ids ([ID, ID, ID]). `ID` refers to an “identifier”. For models with a single-column primary key, `ID` will be a single value, and for models with a composite primary key, it will be an array of values. If one or more records cannot be found for the requested ids, then ActiveRecord::RecordNotFound will be raised. If the primary key is an integer, find by id coerces its arguments by using to_i.
Person.find(1) # returns the object for ID = 1 Person.find("1") # returns the object for ID = 1 Person.find("31-sarah") # returns the object for ID = 31 Person.find(1, 2, 6) # returns an array for objects with IDs in (1, 2, 6) Person.find([7, 17]) # returns an array for objects with IDs in (7, 17), or with composite primary key [7, 17] Person.find([1]) # returns an array for the object with ID = 1 Person.where("administrator = 1").order("created_on DESC").find(1)
Find a record for a composite primary key model
TravelRoute.primary_key = [:origin, :destination] TravelRoute.find(["Ottawa", "London"]) => #<TravelRoute origin: "Ottawa", destination: "London"> TravelRoute.find([["Paris", "Montreal"]]) => [#<TravelRoute origin: "Paris", destination: "Montreal">] TravelRoute.find(["New York", "Las Vegas"], ["New York", "Portland"]) => [ #<TravelRoute origin: "New York", destination: "Las Vegas">, #<TravelRoute origin: "New York", destination: "Portland"> ] TravelRoute.find([["Berlin", "London"], ["Barcelona", "Lisbon"]]) => [ #<TravelRoute origin: "Berlin", destination: "London">, #<TravelRoute origin: "Barcelona", destination: "Lisbon"> ]
NOTE: The returned records are in the same order as the ids you provide. If you want the results to be sorted by database, you can use ActiveRecord::QueryMethods#where method and provide an explicit ActiveRecord::QueryMethods#order option. But ActiveRecord::QueryMethods#where method doesn’t raise ActiveRecord::RecordNotFound.
Find with lock
Example for find with a lock: Imagine two concurrent transactions: each will read person.visits == 2, add 1 to it, and save, resulting in two saves of person.visits = 3. By locking the row, the second transaction has to wait until the first is finished; we get the expected person.visits == 4.
Person.transaction do person = Person.lock(true).find(1) person.visits += 1 person.save! end
Variations of #find
Person.where(name: 'Spartacus', rating: 4) # returns a chainable list (which can be empty). Person.find_by(name: 'Spartacus', rating: 4) # returns the first item or nil. Person.find_or_initialize_by(name: 'Spartacus', rating: 4) # returns the first item or returns a new instance (requires you call .save to persist against the database). Person.find_or_create_by(name: 'Spartacus', rating: 4) # returns the first item or creates it and returns it.
Alternatives for #find
Person.where(name: 'Spartacus', rating: 4).exists?(conditions = :none) # returns a boolean indicating if any record with the given conditions exist. Person.where(name: 'Spartacus', rating: 4).select("field1, field2, field3") # returns a chainable list of instances with only the mentioned fields. Person.where(name: 'Spartacus', rating: 4).ids # returns an Array of ids. Person.where(name: 'Spartacus', rating: 4).pluck(:field1, :field2) # returns an Array of the required fields.