Combining multiple finds into one result

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

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

On May 14, 2:09 pm, Hubert Y. [email protected] 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

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 :slight_smile:

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. [email protected] 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

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

From the rails api docs examples (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

On Fri, May 14, 2010 at 2:24 PM, Hubert Y. [email protected]
wrote:

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

No need to assume :slight_smile:

foos = Foo.all

foos.class
=> Array

FWIW,

Hassan S. ------------------------ [email protected]
twitter: @hassan

Ah, makes perfect sense. Thanks. :slight_smile: