2009-06-10 136 views
5

這個問題很簡單,但我遇到了幾次問題。如何遍歷Ruby On Rails中的活動記錄對象?

比方說,你做這樣的事情:

cars = Vehicle.find_by_num_wheels(4) 

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

此工作正常,如果汽車是一個數組,但如果只有一個數據庫中的汽車發生故障。顯然我可以做一些像「if!cars.length.nil?」的東西或者在調用.each之前,如果汽車對象是一個數組,則檢查其他方式,但每次都有點煩人。

是否有類似於.each的東西來處理這個檢查嗎?還是有一種簡單的方法來強制查詢結果到一個數組,而不管大小?

回答

12

你可能會尋找

cars = Vehicle.find_all_by_num_wheels(4) 

動態find_by_方法只返回一個元素,你必須使用find_all_by_返回多個。

2

如果你總是希望所有的汽車,你應該使用find_all代替:

cars = Vehicle.find_all_by_num_wheels(4) 

你也可以把一個Vehicle到一個數組:

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

你可以做到這一點,以每次得到陣列:

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

我不認爲你有一個將檢查對象是否爲數組的循環。

另一種解決辦法是:

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

(沒有測試,它可能會破壞來測試一個字符串lenght讓我知道如果這樣做。)

2

命名作用域版本的問題

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

我認爲這將是一個匿名範圍,看你怎麼沒有命名它。不過,範圍是一個很好的答案。 – Chuck 2009-06-10 23:27:18