【问题标题】:How do you iterate over active record objects in Ruby On Rails?如何在 Ruby On Rails 中迭代活动记录对象?
【发布时间】:2009-06-10 15:49:10
【问题描述】:

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

假设您执行以下操作:

cars = Vehicle.find_by_num_wheels(4)

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

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

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

【问题讨论】:

    标签: ruby-on-rails activerecord iteration


    【解决方案1】:

    您可能正在寻找

    cars = Vehicle.find_all_by_num_wheels(4)
    

    动态find_by_<em></em>方法只返回一个元素,你必须使用find_all_by_返回多个。

    【讨论】:

      【解决方案2】:

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

      cars = Vehicle.find_all_by_num_wheels(4)
      

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 我认为这将是一个匿名范围,因为您没有命名它。不过,范围是一个很好的答案。
        【解决方案4】:

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

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

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

        另一种解决方案可能是:

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

        (尚未测试,测试字符串的长度可能会中断。如果可以,请告诉我)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-04
          • 1970-01-01
          • 1970-01-01
          • 2013-03-26
          相关资源
          最近更新 更多