2013-01-13 5 views
2

레일을 시작하기 전에 블록 작업이 중단되었습니다. 두 개의 datetime 필드 사이의 차이를 계산하여 모델을 반복하고 정수 필드 값을 업데이트하려고합니다. 콘솔에서 이렇게 '루비 블록 - NoMethodError : 정의되지 않은 메소드 '-'for nil : NilClass

m = MyModel.find(1) 
m.new_integer_field = m.existing_datetime_field - m.parent_object.existing_datetime_field 
m.save 

가 나는 그것이 기본 구문 것 같아요,하지만 나오지 않았어 :

MyModel.all.each do |m| 
    m.new_integer_field = m.existing_datetime_field - m.parent_object.existing_datetime_field 
    m.save! 
end 

결과는 내가 할 경우 하나 개의 기록에 작동

NoMethodError: undefined method `-' for nil:NilClass 

입니다 명백한 설명을 찾는다. 앞으로 몇 가지 조언을 얻게되어 감사하게 생각합니다.

+0

무엇이'MyMethod.all.each {| i | puts i.existing_datetime_field.inspect}'? 이 객체 중 하나가'nil '인 것 같아서'-' 메소드가 정의되지 않은 이유를 설명합니다. –

+0

그것은 나에게 많은 데이트를 주지만, 루프의 끝에서 => nil이 아니다. –

+1

아니, 네가 맞아! 인스턴스 중 하나에 nil 값이 있습니다! –

답변

1

인스턴스 중 하나의 m.existing_datetime_field가 nil이므로 작업이 작동하지 않습니다. 당신이 확실하지 않은 경우 전무 값을 확인해야합니다

MyModel.all.each do |m| 
    unless m.existing_datetime_field == nil 
    m.new_integer_field = m.existing_datetime_field - m.parent_object.existing_datetime_field 
    m.save! 
end 
+1

고맙다 Aldo 'xoen'Giambelluca –

+0

예, 내 대답을 수락하기 위해 이틀간 기다려야합니다 ... –

+0

도움이된다는 것을 알면 기쁘고 당신의 문제는 해결되었습니다;) –

0

이미 인스턴스의 속성 중 하나가 nil입니다 아마 말했듯이.

는 경우에 사용 #inspect을 확인하려면 :

MyModel.all.each {|i| puts i.existing_datetime_field.inspect } 

는 이러한 개체 중 하나가 nil하고 다음 - 방법은 정의되어 있지 않은 것 같다.

제안한 것처럼 피연산자를 확인한 후에 차이점을 계산할 수 있습니다.

관련 문제