2010-12-30 4 views
5

저는 RoR의 초보자입니다. 지금 나는이 재미있는 레일즈 좀비 연습을하고 있습니다.Ruby on Rails 구문 질문

Weapon.where(:zombie => "Ash") 

그러나 그것은 작동하지 않습니다 : 그리고 이것에

내 코드는 ... 몇 가지 구문 질문에 붙어있어. 대신하면 내가 입력 : (첫 번째 무기는 좀비 애쉬에 속하기 때문에 어쨌든) 나는 통과

Weapon.find(1) 

.

제 질문은이 .where() 메소드에 대한 내 대답이 잘못 되었나요?

미리 감사드립니다.

alt text

+1

다음은 관심있는 사람들을위한 자습서 링크입니다. http://railsforzombies.org/ –

+0

질문 해 주셔서 감사합니다.나는 같은 부분에 갇혀 있었고 여기 (특히 라비와 DGM의) 반응은 나에 대한 이유를 설명했다. – Gerry

답변

8

작성할 수

Weapon.where(:zombie => {:name => "Ash"}) 

당신에게 를 줄 것이다 그 좀비에 속한 무기가 '애쉬'인 것

+0

이것은 나에게 희망적으로 보입니다. :) –

2

alt text

alt text

확실하지, 쿼리를 Rails3하지만 나던 할 새로운 : 좀비 좀비 객체가 아니라 그 이름과 일치 할 전망이다.

내가 Zombie.where(:name => "Ash").weapons

+0

크리스. 좀비 클래스에 * weapons * 관계가 설정되어 있지 않은 것 같습니다. 그래서 "#

+1

일대일 관계라면'Zombie.where (: name => "Ash"). weapon'을 사용해보십시오. –

2

당신을 할 것 일반적으로 하나의 객체가 필요한 경우 Model.find() 사용하고 찾을 수없는 경우는 무기 호를 반환합니다. Model.where({:field => value})은 조건과 일치하는 객체의 배열을 반환합니다. 당신이 절은 당신이 이제 단일 값을 반환 어디를 원하는 경우

+1

그냥 뻔뻔스럽게도 : 기술적으로, 레일 3에서는 배열을 반환하지 않습니다. 그것은 ActiveRecord :: Relation을 리턴한다. (이것은 개념적으로 아이템들의 집합이지만, 아직 질의가 없다.) Rails 3에서는 이러한 관계를 하나로 묶을 수 있으며 find_all 또는 각각 또는 유사한 함수를 호출 할 때만 답변을 얻을 수 있습니다. 그렇다하더라도 결과는 배열이 아니라 열거 자입니다. – DGM

3

당신은 다음과 같이 쿼리를 중첩해야

Zombie.where(:name => "ash").first 
+0

질문이 "all"을 묻는 질문이 있기 때문에 저는 그렇게 생각하지 않습니다. –

+0

@Chris 실제로 이것은 작동합니다. Weapons 모델에 가입하려면 .weapons를 끝에 추가해야합니다. – Gerry

+0

죄송합니다. - Thanks @Gerry - 좋은 지적입니다. –

1

좀비 테이블이 무기 타에 연결되어 있으므로 나처럼,이를 통해 시도하려고했던, 경우 좀비 ID 1 = 애쉬

4

- 가 Zombie.find (1) 참고

을 .weapons.all : BLE, 다음과 같은 코드를 사용할 수 있습니다 좀비 모델은 첫 번째 메서드를 사용해야합니다. ()이 (가) 좀비 컬렉션을 반환하기 때문입니다.

Zombie.where(:name => "Ash").first.weapons 

이 튜토리얼은 여전히 ​​이전 해시 구문을 가르치고 있지만, 지금 루비 1.9 이후 (그리고해야) 새로운 단순화 된 형식을 사용할 수 있습니다.이 구문은 심지어 좀비 튜토리얼에서 작동 :

Zombie.where(name:"Ash").first.weapons 
1
Zombie.where(:name => "Ash").first.weapons 

이럴 :이 방법은 더 명시이라고 생각 : 먼저, 우리가 좀비를 찾고 있습니다, 그리고 - 첫 번째의 무기를 먹고 싶어.

확실히, 당신은 좀비의 ID (Weapon.where (: zombie_id => SOME_ZOMBIE_ID))에 의해 무기도 찾아보실 수 있습니다,하지만 나에게로 - 이것은 내가 반년 내 코드에서 참조 할 일이 아니다 이후 - 더 많은 코딩과 이해를위한 더 많은 시간 낭비에 관한 것입니다.

z = Zombie.find("ID") 
Weapon.where(:zombie_id => z) 
1

u는이 코드를 시도 할 수 있습니다 미안 내 대답은 (위 참조) 제리의 대답의 짧은 버전 것 같습니다 그들은 당신이 (영상 기준)을 할 의도

재 = Zombie.find (1) ash.weapons 모든 무기의 배열을 반환해야

재는 소유하고있다. count 메서드를 사용하기 위해 오랫동안 노력했지만 그 다음에는 실제 무기 항목 (배열/목록/C++ 및 파이썬 배경에서 방금 시작한 레일)을 원한다는 것을 알게되었습니다.

+0

다음 운동을 위해 "Ash"에 속하는 모든 무기를 계산하고 싶다면 z.weapons.count –

2

이 방법은 다음과 같습니다 : -

PS 그 :) 이러한 맥락에서

0

Weapon.find(1)을 사용하여 무기 테이블에 무기가 하나만 있었지만 다른 무기를 만들 경우 : id => 1로 설정하면 원래 구문이 작동하지 않습니다. 모든 무기가 아닌 첫 번째 무기 만 반환했기 때문입니다.

나는 Zombie.find(1).weapons을 사용하여 다음과 연관된 무기에 대한 여러 항목을 반환합니다. id = 1이지만 생각하고 있었고 name : not : id로 검색하려고했습니다.

나는 또한 "여기서"속성을 사용하는 방법에 대한 생각,하지만이 동작하지 않습니다 - 내가 대답 @edgerunner 사용 때 반환

#<ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: zombie.name: SELECT "weapons".* FROM "weapons" WHERE "zombie"."name" = 'Ash'> 

그래서 난이 있는지 확실하지 않습니다 프로그램을 통한 한계 또는 무엇인가 - 그대로, 여전히 조금 혼란 스럽다.

+0

'Zombie.find_by_name ('Ash ') .weapons '작품 및 name 특성을 사용하지만 나는 생각하지 않는다. ** find_by_name ** 아직 논의되었습니다. – Brett

1
Weapon.whe­re(:zombie­_id => Zombi­e.where(:n­ame => "Ash"­)) 

DB 무기 중에서 선택할 수 있습니다. zombie_id은 DB Zombie의 Ash입니다.

2

오늘 같은 문제가 생겼지 만 대답은 받아 들일 수 없습니다. 나는 API 2010 년 이후로 변경되었는지 여부를 모르지만 나는 이렇게 일을 가지고 :

Weapon.joi­ns(:zombie­).where(:z­ombies => {:nam­e => "Ash"­}) 
내가 처음 해결책이 무엇을 생각하지만, 당신은 또한 다른 방향으로 결합하여 같은 결과를 얻을 수 있습니다

질문 찾던 :

Zombie.whe­re(:name => 'Ash'­).first.we­apons 
0

답변을 당신이 성공은 모든 애쉬의 무기를 찾는 것 다음 .. Zombie.find(1).weapons입니다.