Как вы перебираете объекты активной записи в Ruby On Rails? - PullRequest
5 голосов
/ 10 июня 2009

Этот вопрос довольно прост, но я несколько раз сталкивался с проблемой.

Допустим, вы делаете что-то вроде:

cars = Vehicle.find_by_num_wheels(4)

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

Это прекрасно работает, если автомобили - это массив, но не работает, если в базе данных есть только одна машина. Очевидно, я мог бы сделать что-то вроде «если! Cars.length.nil?» или проверьте каким-либо другим способом, является ли объект cars массивом перед вызовом .each, но это немного раздражает каждый раз.

Есть ли что-то похожее на .each, которое обрабатывает эту проверку для вас? Или есть простой способ заставить результат запроса в массив независимо от размера?

Ответы [ 4 ]

12 голосов
/ 10 июня 2009

Возможно, вы ищете

cars = Vehicle.find_all_by_num_wheels(4)

Динамические find_by_<em> методы возвращают только один элемент, и вы должны использовать find_all_by_</em>, чтобы вернуть несколько.

2 голосов
/ 11 июня 2009

Именованная версия для вашей задачи

Vehicle.scoped(:conditions => { :num_wheels => 4 } ).each { |car| car.inspect }
2 голосов
/ 10 июня 2009

Если вы всегда хотите, чтобы все машины, вы должны использовать find_all вместо:

cars = Vehicle.find_all_by_num_wheels(4)

Вы также можете превратить один Vehicle в массив с:

cars = [cars] unless cars.respond_to?(:each)
0 голосов
/ 10 июня 2009

Вы можете сделать это для получения массивов каждый раз:

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

Я не думаю, что у вас есть цикл, который проверяет, является ли объект массивом.

Другое решение может быть:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...