5

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

假设您执行以下操作:

cars = Vehicle.find_by_num_wheels(4)

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

如果汽车是一个数组,这很好用,但如果数据库中只有一辆汽车,则失败。显然我可以做类似“if !cars.length.nil?”的事情。或者在调用 .each 之前检查汽车对象是否是一个数组,但每次都这样做有点烦人。

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

4

4 回答 4

12

您可能正在寻找

cars = Vehicle.find_all_by_num_wheels(4)

动态方法只返回一个元素,你必须使用返回多个。find_by_find_all_by_

于 2009-06-10T15:53:14.203 回答
2

如果你总是想要所有的汽车,你应该使用find_all

cars = Vehicle.find_all_by_num_wheels(4)

您还可以使用以下方法将单个Vehicle数组转换为数组:

cars = [cars] unless cars.respond_to?(:each)
于 2009-06-10T15:54:01.220 回答
2

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

Vehicle.scoped(:conditions => { :num_wheels => 4 } ).each { |car| car.inspect }
于 2009-06-10T23:02:02.013 回答
1

You can do this to get arrays everytimes :

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

I don't think that you have a loop that will check if the object is an array.

Another solution could be:

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

(haven't tested, it might break to test the lenght on a string. Let me know if it does)

于 2009-06-10T16:56:10.877 回答