0

我在我的 ruby​​ 脚本中使用 mysql2。使用它来测试对 mysql 数据库的 API 响应

这是我的脚本的一个片段

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.8.7 (2011-06-30 patchlevel 352) [i686-darwin10]它就像一个魅力

但是当我使用ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]它时它不起作用我得到这个错误

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

有人可以帮我解决这个问题吗?

4

1 回答 1

1

当您调用collectEnumerableMysql2::Result)时,您会Enumerator返回一个实例。Enumerators 没有实现数组访问操作符,所以你不能说enumerator[0]和得到任何有用的事情发生;但是,Enumerator确实包括Enumerable所以他们会回应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调用firstresponse

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?如果您的查询没有找到任何内容,那将是正确的,因此如果您不想要异常,您可能需要考虑这一点。

于 2012-05-01T22:52:54.973 回答