5

この質問は非常に単純ですが、私は何度か問題に遭遇しました。

あなたが次のようなことをしたとしましょう:

cars = Vehicle.find_by_num_wheels(4)

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

これは、車が配列の場合は正常に機能しますが、データベースに車が1台しかない場合は失敗します。明らかに、「if!cars.length.nil?」のようなことができます。または、.eachを呼び出す前に、carsオブジェクトが配列であるかどうかを別の方法で確認しますが、それを毎回行うのは少し面倒です。

このチェックを処理する.eachに似たものはありますか?または、サイズに関係なく、クエリ結果を配列に強制する簡単な方法はありますか?

4

4 に答える 4

12

あなたが探しているかもしれません

cars = Vehicle.find_all_by_num_wheels(4)

動的メソッドは1つの要素のみを返し、複数を返すにはを使用する必要があります。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

これを行うと、毎回配列を取得できます。

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

オブジェクトが配列であるかどうかをチェックするループはないと思います。

別の解決策は次のとおりです。

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

(テストしていません。文字列の長さをテストすると破損する可能性があります。テストした場合はお知らせください)

于 2009-06-10T16:56:10.877 に答える