Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you iterate over active record objects in Ruby On Rails?

This question is quite simple but I have run into the problem a few times.

Let's say you do something like:

cars = Vehicle.find_by_num_wheels(4)

cars.each do |c|
  puts "#{c.inspect}"
end

This works fine if cars is an array but fails if there is only one car in the database. Obviously I could do something like "if !cars.length.nil?" or check some other way if the cars object is an array before calling .each, but that is a bit annoying to do every time.

Is there something similar to .each that handles this check for you? Or is there an easy way to force the query result into an array regardless of the size?

like image 490
Tony Avatar asked Jun 10 '09 15:06

Tony


3 Answers

If you always want all of the cars, you should use find_all instead:

cars = Vehicle.find_all_by_num_wheels(4)

You could also turn a single Vehicle into an array with:

cars = [cars] unless cars.respond_to?(:each)
like image 37
Steve Madsen Avatar answered Sep 24 '22 13:09

Steve Madsen


You might be looking for

cars = Vehicle.find_all_by_num_wheels(4)

The dynamic find_by_ methods only return one element and you have to use find_all_by_ to return multiple.

like image 71
erik Avatar answered Sep 24 '22 13:09

erik


Named scoped version for your problem

Vehicle.scoped(:conditions => { :num_wheels => 4 } ).each { |car| car.inspect }
like image 38
Subba Rao Avatar answered Sep 24 '22 13:09

Subba Rao