2012-12-27 2 views
0

실패, puts self.ideas.inspect 출력 : 다음 줄에 그러나처음, 내 응용 프로그램에서

[#<Idea id: 1, title: "Ad et ut nesciunt ut.", 
note: ["Ratione et aut harum.", "Dicta nostrum sit officiis voluptates molestiae veritatis ut."], 
status: "claimed", 
created_at: "2012-12-27 19:03:11", updated_at: "2012-12-27 19:03:11", user_id: 1>, 
#<Idea id: 2, title: "Asperiores dolores modi et.", 
note: ["Reprehenderit harum consequuntur repellendus qui.", "Labore eum minus voluptas quidem aliquid est occaecati."], 
status: "claimed", 
created_at: "2012-12-27 19:03:11", updated_at: "2012-12-27 19:03:11", user_id: 1>, 
#<Idea id: 3, title: "Labore nam deserunt quibusdam.", 
note: ["Sequi saepe itaque.", "Numquam distinctio vel hic et qui."], 
status: "claimed", 
created_at: "2012-12-27 19:03:11", updated_at: "2012-12-27 19:03:11", user_id: 1>] 

, claimed_count = self.ideas.where(status: "claimed").size 반환 0. 나의 쿼리 구문은 분명히 잘못된 것입니다,하지만 난 봤는데 this guide 이상으로 쏟아져 나와 나는 아직도 그것을 이해할 수 없다!

아주 기본적인 것이어야합니다 ... 누구입니까?

편집 : 나는 다음과 같은 테스트를 사용하여 아이디어의 컬렉션 가지고 :

it "can't claim an idea if he already has 3 ideas with claimed status" do 
    james.claim(si_title0) 
    james.claim(si_title1) 
    james.claim(si_title2) 
    james.claim(si_title3) 
    james.ideas.size.should eq 3 
end 

내가 못생긴 시험 미안 해요 ... 난 후 리팩토링에 대한 보간을 파악하려고 거라고 나는 그것이지나 가게한다. 위의 inspect 덤프 루프의 세 번째 또는 네 번째 반복에서 덤프입니다.

편집 2 : 그것은 데이터베이스에 저장 않습니다 ...

def claim(idea) 
    puts self.ideas.inspect 
    #claimed_count = self.ideas.where(status: "claimed").count 
    claimed_count = self.ideas.count(conditions: "status='claimed'") 
    puts "claimed_count is #{claimed_count.inspect}" 
    if idea.status == "available" && claimed_count < 3 
     self.ideas<<idea 
     idea.status = "claimed" 
    end 
    end 

를 따라서 : 이것은 claim은 무엇입니까? 그렇다면 어떻게 수정해야합니까?

+0

"아이디어"모음을 어떻게 얻었습니까? 발표 할 때 이미이 상태로 데이터베이스에 저장 되었습니까? – PinnyM

+0

'.size' 대신'.count'가 작동합니까? – Zabba

+0

@PinnyM - 위의 호출 코드를 추가하도록 편집되었습니다. – ezuk

답변

3

나는 claim()이 "claim"idea 상태를 데이터베이스에 저장하지 않는다고 생각합니다. 이 동작 (실제로 필요한 경우)을 변경하거나 where을 통해 데이터베이스를 쿼리하는 대신 ideas Enumerable 자체를 검색해야합니다. 당신은이에 대한 select를 사용할 수 있습니다

james.ideas.select{|idea| idea.status == "claimed"}.size 

그리고 당신은 쿼리 할 Idea에 도우미 메서드를 추가 할 수 있습니다 간단 :

class Idea < ActiveRecord::Base 
    def claimed? 
    status == "claimed" 
    end 
end 

james.ideas.select(&:claimed?).size 

UPDATE

로 상태를 저장하지 않습니다 귀하의 코드 status 특성을 변경 한 후에는 idea 개체를 저장하기 위해 호출 된 것이 없기 때문입니다. 당신은 당신의 전화의 순서를 반대로하여이 문제를 해결할 수 있습니다 : 당신이 영속 객체의 관련 컬렉션에 추가되기 때문에

if idea.status == "available" && claimed_count < 3 
    idea.status = "claimed" 
    self.ideas<<idea 
end 

<< '삽'연산자가 아이디어를 저장합니다.

+0

아마 네가 맞다고 생각하고 '클레임'이 저장되지 않는다면 ... 나는 생각했다.나는 전체'claim '몸을 포함하도록 질문을 편집했다 - 당신은 볼 수 있 었는가? – ezuk

+0

아니, 그렇게하면 저장되지 않습니다. 수정 방법에 대한 제 제안을 참조하십시오. – PinnyM

+0

와우! 그것은 절대적으로 효과가있다! 답변을 수락했으나 왜 작동하는지 설명해 주시겠습니까? 'self.ideas << idea'를하면 어떻게됩니까? – ezuk

0

각 테스트가 끝날 때 데이터가 손상됩니다. 테스트가 끝나면 삽입 된 데이터가 롤백됩니다. 그것은 테스트 사이에 지속되지 않아야합니다!

where을 어디에서 어떻게 사용하고 있습니까? 모델 (구체적으로 ideas 연결)은 어떻게 생겼습니까?