2009-06-10 23 views
5

Esta pregunta es bastante simple, pero me he encontrado con el problema varias veces.¿Cómo se itera sobre objetos de registro activos en Ruby On Rails?

Digamos que hacer algo como:

cars = Vehicle.find_by_num_wheels(4) 

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

Esto funciona bien si los coches es un array, pero falla si sólo hay un coche en la base de datos. Obviamente, podría hacer algo como "if! Cars.length.nil?" o revise de otra manera si el objeto de los autos es una matriz antes de llamar .each, pero eso es un poco molesto de hacer cada vez.

¿Hay algo similar a .each que maneja este cheque por usted? ¿O hay una manera fácil de forzar el resultado de la consulta en una matriz independientemente del tamaño?

Respuesta

12

Usted podría estar buscando

cars = Vehicle.find_all_by_num_wheels(4) 

Los métodos dinámicos find_by_ sólo devuelven un elemento y se tienen que utilizar para volver find_all_by_ múltiple.

2

Si siempre desea que todos los coches, se debe utilizar find_all lugar:

cars = Vehicle.find_all_by_num_wheels(4) 

También puede convertir un solo Vehicle en una matriz con:

cars = [cars] unless cars.respond_to?(:each) 
0

Usted puede hacer esto a obtener matrices todo el tiempo:

cars = Vehicle.find(:all, :conditions => {num_wheels => 4}) 

No creo que tenga un bucle que verificará si el objeto es una matriz.

Otra solución podría ser:

for i in (1..cars.lenght) 
    puts cars[i].inspect 
end 

(no han probado, podría romper para probar la longitud de una cuerda Avisadme si lo hace.)

2

versión de ámbito Llamado así por su problema

Vehicle.scoped(:conditions => { :num_wheels => 4 }).each { |car| car.inspect } 
+0

Creo que sería un alcance anónimo, ya que no lo nombraste. Los ámbitos son una buena respuesta a esto, sin embargo. – Chuck