这个问题很简单,但我已经遇到过这个问题了几次。
假设你做了类似的事情:
cars = Vehicle.find_by_num_wheels(4)
cars.each do |c|
puts "#{c.inspect}"
end
如果汽车是一个阵列,这可以正常工作,但如果数据库中只有一辆汽车则会失败。显然我可以做一些像“if!cars.length.nil?”的事情。或者在调用.each之前,如果cars对象是一个数组,请检查其他方式,但每次都有点烦人。
是否有类似.each的东西可以为您处理此检查?或者是否有一种简单的方法可以将查询结果强制为数组而不管大小?
答案 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
(尚未测试,它可能会破坏以测试字符串上的长度。如果有,请告诉我)