1

特定のレコードを返すメソッドを持つモデルMyModelがあります (以下のロジックを参照)。

def self.find_future_rec   #note2
  rec = find(rand(MyModel.count)+1)   #note1
  while rec.nil? | (rec.expdate<Date.today)
    rec = find(rand(MyModel.count)+1)
  end
  return rec
end

クラスのすべてのレコードには、MyModelクラスの変数expdateがありますDate。(これはレコードを見つけるのに恐ろしい方法であることはわかっています。これは、私自身の啓蒙といくつかのテスト コードのためのものです。)

  1. このメソッドは、適切なレコードを見つける前にいくつかの望ましくないレコードを反復処理しますが、返されるレコードは常に、note 1最初に照会されたレコードである で見つかったレコードです。ここで怠惰な割り当てが行われていますか?
  2. 静的コンテキストでメソッドを呼び出せるようにselfatを追加する必要がありました。note2これは正しい解釈ですか?
4

2 に答える 2

1

検索する単一の ID を指定した場合、このfindメソッドは戻りnilません。要求しているレコードが見つからない場合は、ActiveRecord::RecordNotFound例外が発生します。したがって、recは常に non-nilであり、rec.nil?常に false です。つまり、ループは次のようになります。

while rec.expdate < Date.today

ループが常にrecfrom#note1を返す場合、ループにまったく入ることがなく、最初の試行でwhile常に望ましい結果が得られます。MyModel

その他の考慮事項:

  1. 場合によっては削除されることがあるためModel.count + 1、必ずしも最大 ID ではありません。
  2. find失敗を示すために例外が発生するためrescue ActiveRecord::RecordNotFound、チェックするのではなく、チェックする必要がありますnil
于 2012-12-21T00:17:17.563 に答える
-1

|ブール ORを使用しています。orまたはを使用してみてください||

selfメソッドをクラスメソッドにするために追加すること(「静的」は適切な近似です)は、これにアプローチする正しい方法の1つです。

于 2012-12-21T00:01:12.787 に答える