61

So I have an array of user ids. Is there a way in rails console to query all of these user's with the array

something like

ids = [1, 2, 3, 4]

users = User.find(ids)

and have it return all 4 users?

2
  • 2
    It does work. You can pass an array of IDs to the model's find method and, provided they are all existing IDs, you will get back an array of user's for those IDs. Commented Jan 29, 2014 at 15:52
  • Didn't realized this worked... haha. Should have tested it. Commented Jan 29, 2014 at 16:19

6 Answers 6

141

For an array, you can use one of these:

# Will raise exception if any value not found
User.find( [1,3,5] )

# Will not raise an exception
User.find_all_by_id( [1,3,5] ) # Rails 3
User.where(id: [1,3,5])        # Rails 4

If you happen to be using a range, you can use these:

# Will raise exception if any value not found
User.find((1..4).to_a)   #same as User.find([1,2,3,4])

# Will not raise an exception
User.find_all_by_id(1..4)  # Rails 3
User.where(id: 1..4)       # Rails 4

As @diego.greyrobot notes in a comment, a range causes a SQL BETWEEN clause, whereas an array causes a SQL IN clause.

Don't use User.find_by_id() -- It will only return one record, no matter how may IDs you pass in.

Sign up to request clarification or add additional context in comments.

7 Comments

My actual array isn't from 1 - 4. The ids are sporadic for example 122, 323, 451. Can I still achieve that?
There's a few inaccuracies here: User.find((1..4).to_a) will make it work. And: 1..4 creates a Range not an Array.
Yes, it's important to note that passing in a range (User.find_all_by_id(1..4)) will execute a sql BETWEEN clause, whereas passing in an array will do a sql IN statement.
Edited to add Rails 4 preferred versions.
.find returns Array. Whereas .where returns ActiveRecord::Relation
|
17

you can use User.where(id: ids)

2 Comments

In Rails 4, find_all_by_id is deprecated, so use where.
And in rails 5, it appears not to work at all, so definitely use User.where(id: [1,2,3,4])
4

Use splash operator:

ids = [1, 2, 3, 4]

users = User.find(*ids)

Note that it will raise an exception if it fails to find any of the users.

3 Comments

Ooh, that's neat. I didn't know about that one.
You don't need to splat it, find takes an array just fine.
I'm finding that too. The splat does nothing.
4

This is work for me...

ids = [1, 2, 3, 4]

users = User.find(ids)

users = User.find(*ids)

users = User.find_all_by_id(ids)

All are working..

Comments

2

What you're doing is supposed to work when all the ids exist.

The reason you might be seeing an exception is because at least one of those ids does not exist in the database.

Instead, you want to use find_all_by_id if you don't want to get an exception:

User.find_all_by_id([1, 2, 3, 4])

# Does the following sql:    
User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2, 3, 4)

Comments

2

you can use

   Users.where({ id: [1,2,3 ,4]})
 # SELECT * FROM users WHERE id IN (1,2,3,4)

1 Comment

I would encourage you to expand on this answer to provide some explanation. An answer that is all code doesn't really provide a lot of information to other users that are unfamiliar with the concepts in the question.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.