# Combining multiple finds into one result

**URL:** <https://www.ruby-forum.com/t/combining-multiple-finds-into-one-result/188620>\
**Category:** Rails\
**Created:** [May 14, 2010, 9:09pm UTC](https://www.ruby-forum.com/t/combining-multiple-finds-into-one-result/188620 "2010-05-14T21:09:56Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![cinderedmonkey](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/74df32/32.png) [@cinderedmonkey](https://www.ruby-forum.com/u/cinderedmonkey)\
**Post date:** [May 14, 2010, 9:09pm UTC](https://www.ruby-forum.com/t/combining-multiple-finds-into-one-result/188620/1 "2010-05-14T21:09:56Z")

</div>

What I want to do is something like this:

searchid = 4  
while searchid != -1  
@a += A.find\_by\_someid(searchid)  
@b = B.find\_by\_someid(searchid)  
searchid = @b.parentid  
end

The problem being the line

@a += A.find\_by\_someid(searchid)  
The error being something like

NoMethodError: undefined method `+’ for #\<A:0x173f9a0\>

I tried to simply do a @a=[] but then it complains ‘A’ cannot be  
converted into an Array.

So, how do you combine multiple ‘find’ requests?  
And what format do the finds return if not an array?  
The output from a find looks something like:  
=\> #\<A id: 99, name: “A Name”\>

Thanks

---

<div class="post-metadata">

**Author:** ![cinderedmonkey](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/74df32/32.png) [@cinderedmonkey](https://www.ruby-forum.com/u/cinderedmonkey)\
**Post date:** [May 14, 2010, 9:23pm UTC](https://www.ruby-forum.com/t/combining-multiple-finds-into-one-result/188620/2 "2010-05-14T21:23:38Z")

</div>

The .find\_by\_…(…) meth returns the first model object found (or  
nil if none found), whereas .find(:all, …) meth returns an array:

$ ./script/console

> > puts Foo.find\_by\_id(1).class  
> > Foo

> > puts Foo.find\_by\_id(0).class  
> > NilClass

> > puts Foo.find(:all).class  
> > Array

Jeff

---

<div class="post-metadata">

**Author:** ![cinderedmonkey](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/74df32/32.png) [@cinderedmonkey](https://www.ruby-forum.com/u/cinderedmonkey)\
**Post date:** [May 14, 2010, 9:25pm UTC](https://www.ruby-forum.com/t/combining-multiple-finds-into-one-result/188620/3 "2010-05-14T21:25:23Z")

</div>

On May 14, 2:09 pm, Hubert Y. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> The output from a find looks something like:  
> =\> #\<A id: 99, name: “A Name”\>

I’m not exactly sure I understand what you’re trying to do, but I  
think you want something like this:

@a = [] # start with an empty array

@a \<\< A.find\_by\_id(some\_id) # returns an object, or null if not  
found; push into array  
@a \<\< B.find\_by\_id(some\_id) # returns an object, or null if not  
found; push into array

@a.compact! # removes null entries from the array

Does that help?

Jeff

[www.purpleworkshops.com](http://www.purpleworkshops.com)

---

<div class="post-metadata">

**Author:** ![cinderedmonkey](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/74df32/32.png) [@cinderedmonkey](https://www.ruby-forum.com/u/cinderedmonkey)\
**Post date:** [May 14, 2010, 11:21pm UTC](https://www.ruby-forum.com/t/combining-multiple-finds-into-one-result/188620/4 "2010-05-14T23:21:58Z")

</div>

Ahh that works, thanks!  
I think I had the general idea but I think every time I tried

@a = []  
I tried  
@a += A.find\_by\_id(some\_id)

while every time I tried  
@a \<\< A.find\_by\_id(some\_id)  
I never tried the  
@a = []  
…whoops,

thanks for all the help.  
Plus never seen @a.compact!, helps a lot 🙂

btw, in general what I was looking for was a way to put the .find  
methods inside a loop and combine all the results into one result,  
everything else was just fluff.

Jeff C. wrote:

> On May 14, 2:09ï¿½pm, Hubert Y. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > The output from a find looks something like:  
> > =\> #\<A id: 99, name: “A Name”\>
> 
> I’m not exactly sure I understand what you’re trying to do, but I  
> think you want something like this:
> 
> @a = [] # start with an empty array
> 
> @a \<\< A.find\_by\_id(some\_id) # returns an object, or null if not  
> found; push into array  
> @a \<\< B.find\_by\_id(some\_id) # returns an object, or null if not  
> found; push into array
> 
> @a.compact! # removes null entries from the array
> 
> Does that help?
> 
> Jeff
> 
> [www.purpleworkshops.com](http://www.purpleworkshops.com)

---

<div class="post-metadata">

**Author:** ![cinderedmonkey](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/74df32/32.png) [@cinderedmonkey](https://www.ruby-forum.com/u/cinderedmonkey)\
**Post date:** [May 14, 2010, 11:24pm UTC](https://www.ruby-forum.com/t/combining-multiple-finds-into-one-result/188620/5 "2010-05-14T23:24:26Z")

</div>

Ahh, thanks. Should of thought of that one. Quick question, when you do  
a .find(:all) I’m assuming it returns an array of objects?

Jeff B.systems wrote:

> The .find\_by\_…(…) meth returns the first model object found (or  
> nil if none found), whereas .find(:all, …) meth returns an array:
> 
> $ ./script/console
> 
> > > puts Foo.find\_by\_id(1).class  
> > > Foo
> 
> > > puts Foo.find\_by\_id(0).class  
> > > NilClass
> 
> > > puts Foo.find(:all).class  
> > > Array
> 
> Jeff

---

<div class="post-metadata">

**Author:** ![cinderedmonkey](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/74df32/32.png) [@cinderedmonkey](https://www.ruby-forum.com/u/cinderedmonkey)\
**Post date:** [May 14, 2010, 11:57pm UTC](https://www.ruby-forum.com/t/combining-multiple-finds-into-one-result/188620/6 "2010-05-14T23:57:08Z")

</div>

From the rails api docs examples ([http://api.rubyonrails.org/classes/](http://api.rubyonrails.org/classes/)  
ActiveRecord/Base.html#M002263):

…

# find all

Person.find(:all) # returns an array of objects for all the rows  
fetched by SELECT \* FROM people  
Person.find(:all, :conditions =\> [ “category IN (?)”,  
categories], :limit =\> 50)  
Person.find(:all, :conditions =\> { :friends =\> [“Bob”, “Steve”,  
“Fred”] }  
Person.find(:all, :offset =\> 10, :limit =\> 10)  
Person.find(:all, :include =\> [:account, :friends])  
Person.find(:all, :group =\> “category”)  
…

Jeff

---

<div class="post-metadata">

**Author:** ![cinderedmonkey](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/74df32/32.png) [@cinderedmonkey](https://www.ruby-forum.com/u/cinderedmonkey)\
**Post date:** [May 15, 2010, 12:19am UTC](https://www.ruby-forum.com/t/combining-multiple-finds-into-one-result/188620/7 "2010-05-15T00:19:23Z")

</div>

On Fri, May 14, 2010 at 2:24 PM, Hubert Y. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Quick question, when you do  
> a .find(:all) I’m assuming it returns an array of objects?

No need to assume 🙂

> > foos = Foo.all  
> > …  
> > foos.class  
> > =\> Array

## FWIW,

Hassan S. ------------------------ removed\_email\_address@domain.invalid  
twitter: @hassan

---

<div class="post-metadata">

**Author:** ![cinderedmonkey](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/74df32/32.png) [@cinderedmonkey](https://www.ruby-forum.com/u/cinderedmonkey)\
**Post date:** [May 15, 2010, 4:05am UTC](https://www.ruby-forum.com/t/combining-multiple-finds-into-one-result/188620/8 "2010-05-15T04:05:28Z")

</div>

Ah, makes perfect sense. Thanks. 🙂
