如何在Ruby On Rails中迭代活动记录对象?

时间:2009-06-10 15:49:11

标签: ruby-on-rails activerecord iteration

这个问题很简单,但我已经遇到过这个问题了几次。

假设你做了类似的事情:

cars = Vehicle.find_by_num_wheels(4)

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

如果汽车是一个阵列,这可以正常工作,但如果数据库中只有一辆汽车则会失败。显然我可以做一些像“if!cars.length.nil?”的事情。或者在调用.each之前,如果cars对象是一个数组,请检查其他方式,但每次都有点烦人。

是否有类似.each的东西可以为您处理此检查?或者是否有一种简单的方法可以将查询结果强制为数组而不管大小?

4 个答案:

答案 0 :(得分:12)

您可能正在寻找

cars = Vehicle.find_all_by_num_wheels(4)

动态find_by_ 方法只返回一个元素,您必须使用find_all_by_ 才能返回多个元素。

答案 1 :(得分:2)

如果您总是想要所有汽车,则应使用find_all代替:

cars = Vehicle.find_all_by_num_wheels(4)

您还可以将单个Vehicle转换为数组:

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

答案 2 :(得分:2)

为您的问题命名的范围版本

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

答案 3 :(得分:0)

每次都可以这样做以获取数组:

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

我认为你没有一个循环来检查对象是否是一个数组。

另一种解决方案可能是:

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

(尚未测试,它可能会破坏以测试字符串上的长度。如果有,请告诉我)