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

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">

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 Cohen wrote:

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 Burlysystems wrote:

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

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,

Ah, makes perfect sense. Thanks. :slight_smile: