2012-05-01 2 views
0

루비 스크립트에서 mysql2를 사용하고 있습니다. MySQL의 DB루비에서 수집하는 메소드에서 Mysql2 응답이 작동하지 않습니다.

이에 대한 API 응답을 테스트하려면이 옵션을 사용하여 내가 ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-darwin10] 이것을 사용하면

test_job_by_id_5 
id = $data["jobs"]["id"][i] # example 5 
job = JobServices.job_by_id(id) 
response = @@con.query("select * from jobs where id = #{id}") #select * from jobs where id =5 
rs=response.collect #this fails 
assert_match(job[0]['title'],rs[0]['title'],"The title values are equal for #{$data["jobs"]["id"][i]}") 
end 

그래서 그것이 매력

같은 작품 내 스크립트의 조각입니다하지만 난 ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]를 사용할 때 내가이 오류를 얻을 작동하지 않습니다

NoMethodError: undefined method '[]' for 
#<Enumerator: #<Mysql2::Result:0x00000012d19f18>:collect> 

수있는 하나하시기 바랍니다 시간 이 문제를 해결할 수 있습니까?

+0

우선, 명확성을 위해'assert_match' 행 내에서 해시 색인 문자열에 대해 작은 따옴표를 사용하는 것을 고려해 보겠습니다. –

+0

나는 작은 따옴표를 사용하고 있다고 생각하는데, 무슨 뜻인지 모르겠다. – Amey

+0

어쩌면 마지막 문자열을 다시 보게 될 것이다. "제목 값 ..."이제 내가 무슨 뜻인지 아시오? –

답변

1

Enumerable (Mysql2::Result)에 collect을 호출하면 Enumerator 인스턴스가 반환됩니다. Enumerator 배열 액세스 연산자를 구현하지 않으므로 enumerator[0]을 말할 수 없으며 아무 일도 일어나지 않습니다. 그러나, EnumeratorEnumerable가 포함되어 있지 않습니다 그래서 그들은 그래서 아마 당신은이 작업을 수행 할 수 first에 응답 않습니다

rs = response.collect 
row = rs.first 
assert_match(job[0]['title'], row['title'], "The title values are equal for #{$data["jobs"]["id"][i]}") 

을하거나 완전히 Enumerator를 건너 뛰고 responsefirst 전화 : 심지어이

row = response.first 
assert_match(job[0]['title'], row['title'], "The title values are equal for #{$data["jobs"]["id"][i]}") 

또는 :

row = @@con.query("select * from jobs where id = #{id}").first 
assert_match(job[0]['title'], row['title'], "The title values are equal for #{$data["jobs"]["id"][i]}") 

row.nil?은 쿼리에서 아무 것도 찾지 못하면 true이고, 예외를 원하지 않으면 고려해야 할 수도 있습니다.

+0

응답 주셔서 감사합니다,이 아마 그것을 할 것이다,하지만 반환 된 모든 행을 반복 할 필요가 및 반환되는 행을 얼마나 알 수 있습니까? 'each'를 사용하지만 DB 응답에'each'를 쓰는 대신에 나는 각 API 응답을 위해 그것을 할 필요가 있습니다. 따라서 두 번째와 세 번째가 있는지 확실하지 않습니다. – Amey

+0

@perlnewbie : 무슨 뜻인지 잘 모르겠지만 어쩌면 당신은 그것을 뒤집거나 배열로 모든 결과를 가져올 수 있습니다. 그리고 나서'job '및 해당 배열을 동시에 표시합니다. –

+0

나는 collect '를 사용하지 않고'response [0] ['title ']'을하지 않으면 작동하지 않는다. 따라서 기본적으로 job.each do | i |를 수행하면 같은 루프에서 작업과 응답을 반복 할 수 없습니다. assert_match (job [i] [ 'title'], response [i] [ 'title']) end' – Amey

관련 문제