2012-12-20 3 views
1

특정 레코드를 반환하는 메소드가있는 MyModel 모델이 있습니다 (아래 로직 참조).for 루프, 예기치 않은 복귀가있는 ruby ​​메소드

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 클래스의 각 레코드는 변수 expdateDate 클래스가 있습니다.

  1. 이 방법은 적절한 기록을 발견하기 전에 몇 가지 바람직하지 않은 레코드를 반복한다 (나는.이 내 자신의 교화에 더 또한 몇 가지 테스트 코드,이 기록을 찾을 수있는 끔찍한 방법을 알고)하지만 기록 반환 된 값은 항상 첫 번째 레코드 인 note 1입니다. 여기에 어떤 게으른 일이 있습니까?
  2. selfnote2에 추가해야 정적 컨텍스트에서 메서드를 호출 할 수 있습니다. 이것이 올바른 해석입니까?
+0

루프가 반복되는 것을 어떻게 생각합니까? –

+0

내 터미널에서 원하지 않는 레코드를 찾는 여러 개의 DB 히트를 볼 수 있습니다. – yamori

+0

더 많은 정보 (루프의 앞, 뒤, 뒤의'rec.expdate '의 일부 디버깅 출력)를 추가해야합니다. –

답변

1

find 메서드는 찾기 위해 하나의 ID를 지정하면 nil을 반환하지 않습니다. 요청한 레코드를 찾을 수 없으면 ActiveRecord::RecordNotFound 예외가 발생합니다. 따라서 rec은 항상 nil이 아니며 rec.nil?은 항상 false입니다. 그게 당신의 루프는 다음과 같이 정말 것을 의미한다 :

while rec.expdate < Date.today 

루프는 항상 당신이 결코 모두의 while 루프를 입력하지있어 당신은 항상 첫 번째에 바람직한 MyModel을 받고있어 #note1에서 rec을 반환하는 경우 시험.

다른 점은 고려해야 할

때때로
  1. 가지로 삭제 그래서 Model.count + 1 반드시 최대 ID가 아닙니다.
  2. find은 오류를 나타내는 예외가 발생하므로 nil을 확인하는 대신 rescue ActiveRecord::RecordNotFound이 필요합니다.
-1

당신은 |을 부울 OR로 사용하고 있습니다. or 또는 ||을 사용해보십시오.

메서드를 만들기 위해 self을 추가하면 ("정적"은 괜찮은 근사치입니다) 실제로이 문제에 접근하는 올바른 방법 중 하나입니다.

+1

'|'는 (보통) 비트 OR이지만'|'과'||'는 부울 값과 같습니다. –

관련 문제