2009-06-10 11 views
5

Questa domanda è abbastanza semplice, ma ho incontrato il problema alcune volte.Come si esegue iterazione su oggetti record attivi in ​​Ruby On Rails?

Diciamo che fare qualcosa di simile:

cars = Vehicle.find_by_num_wheels(4) 

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

Questo funziona bene se le macchine è un array, ma non riesce se non v'è una sola auto nel database. Ovviamente potrei fare qualcosa come "if! Cars.length.nil?" o controllare in qualche altro modo se l'oggetto auto è un array prima di chiamare .each, ma questo è un po 'fastidioso da fare ogni volta.

Esiste qualcosa di simile a .each che gestisce questo controllo? O c'è un modo semplice per forzare il risultato della query in un array indipendentemente dalle dimensioni?

risposta

12

si potrebbe essere alla ricerca di

cars = Vehicle.find_all_by_num_wheels(4) 

Le dinamiche find_by_ metodi restituiscono un solo elemento e si deve utilizzare find_all_by_ per tornare più.

2

Se vuoi sempre tutte le auto, si consiglia di utilizzare find_all invece:

cars = Vehicle.find_all_by_num_wheels(4) 

si potrebbe anche trasformare in un singolo Vehicle in un array con:

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

Si può fare questo a ricevi array ogni volta:

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

Non penso che tu abbia un ciclo che controllerà se l'oggetto è un array.

Un'altra soluzione potrebbe essere:

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

(non ho ancora testato, potrebbe rompere per testare la lunghezza su una stringa Fatemi sapere se lo fa.)

2

versione ambito Chiamato per la vostra problema

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

Penso che sarebbe un ambito anonimo, visto che come non lo hai nominato. Le sfere sono una buona risposta a questo, però. – Chuck