2010-02-07 7 views
0

내 질문을 명확하게하겠습니다. @ student.rooms.last에서 정수 값을 얻으려고하는데, @ student.rooms.last만으로는 정수 값을 줄 수 없다.정의되지 않은 로컬 변수 또는 메서드

Student.transaction do 
if @student.test! 
x = @student.site_id.to_int 
y = @student.rooms.last 

book = Book.find(:first, :conditions => ["location_id = ? AND room_id = ?", x, y]) 

    room = Room.new 
    room.student_id = @student.id 
    if room.save 
    book.room_id = room.id 

는 지금이 오류를 반환 : 당신이 그것을 기대하지 않았다 때이 전무 개체가! 평가하는 동안 오류가 발생했습니다. nil.room_id = id가 책 room_id 외래 키와 동일한 @student와 연결된 방 레코드를 찾으려고합니다. 모든 응답 주셔서 감사합니다.

+1

마지막 요소를 얻기 위해'@ student.rooms'를 반복하는 이유는 무엇입니까? 제 말은 왜 마지막 요소를 직접 가져올 수 없습니까? –

+0

Rails에게 아이템 주문 방법을 알려주지 않았다면리스트에서'first' 또는'last'를 선택하는 것과 어떤 차이가 있습니까? –

답변

5

저는 블록 스코프에만 z가 존재하며 외부에 정의해야한다고 생각합니다.

rooms = @student.rooms 
z = nil 
rooms.each do |room| 
    if room.id == @student.rooms.length - 1 
    z = room.id 
end 
end 
book = Book.find(:first, :conditions => ["room_id = ?", z]) 

정말하지만, 왜 일을하지 않습니다 :

book = @student.rooms.last.books.first 

? 귀하의 스크립트에 대한 모호한 이해에서, 그것은 똑같은 것처럼 보입니다.

그리고 책은 첫 번째보다 다른 학생들에 속한 경우, 말, 학생 ID를 1로 5 권의 책을 소유하는 경우 @student.rooms.length - 1는 해당 학생의 마지막 책의 ID가 될 것이기 때문에 코드가, 휴식 것처럼 거의 느낀다 4 ... 아니, 기다려. 이 코드는 두 번째로 마지막 책을 반환해야합니다. 맞습니까? 그리고 학생이 데이터베이스의 첫 번째 서적을 소유 한 경우에만?

바, 무엇이든. 고전적인 ActiveRecord 메서드 만 사용하면됩니다.

관련 문제