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

5
这个问题很简单,但我遇到过几次这个问题。
假设你做了以下操作:
cars = Vehicle.find_by_num_wheels(4)

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

如果cars是一个数组,这段代码可以正常运行,但如果数据库中只有一辆车,则会失败。显然,我可以像"if !cars.length.nil?"这样做,或者在调用.each之前以某种其他方式检查cars对象是否为数组,但每次都这样做有点烦人。

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

4个回答

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)

2

为您的问题命名作用域版本

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

我认为这将是一个匿名作用域,因为您没有为其命名。不过,作用域是解决这个问题的好方法。 - Chuck

1
你可以每次这样获取数组:
cars = Vehicle.find(:all, :conditions => {num_wheels => 4})

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

另一个解决方案可能是:

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

(还没有测试,可能会在字符串长度测试时出现问题。如果有问题,请告诉我)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接