2009-06-10 4 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 

(не проверял, он может сломаться, чтобы проверить длину на строку Позвольте мне знать, если он делает.)

2

Названы контекстными версия для Вашего проблема

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

Я думаю, что это был бы анонимный объем, видя, как вы его не называли. Скоменты - хороший ответ на это. – Chuck

Смежные вопросы