2014-04-11 4 views
0

MySQL에서 쿼리를 수행했지만 레일즈가 작동하지 않아 mysql2 gem이 설치되었다.mysql2 gem을 사용하여 내 뷰에서 값을 표시 할 수 없다

http://sqlfiddle.com/#!2/9adb8/6 

질의 문제없이 잘 작동하고,이 결과를 도시한다 : 레일 2.3.8

gem install mysql2 -v0.2.6 
위한

UNIT V1 A1 N1 V2 A2 N2 V3 A3 N3 V4 A4 N4 V5 A5 N5 
LIFE 2 0 0 1 2 0 0 0 0  0 0 0 0 0 0 
ROB 0 1 0 0 1 2 0 0 0  0 0 0 0 0 0 

-Installed mysql2 보석 여기

는 정보 인

- 만든 컨트롤러 :

class PolicyController < ApplicationController 

    def index 
     @result = ActiveRecord::Base.connection.execute("select distinct @sql := concat('SELECT pb.name as unit,',group_concat(concat('SUM(CASE WHEN p.state =0 AND ce.id=',id,' THEN 1 ELSE 0 END) AS v',id,',SUM(CASE WHEN p.state =1 AND ce.id=',id,' THEN 1 ELSE 0 END) AS a',id,',SUM(CASE WHEN p.state =2 AND ce.id=',id,' THEN 1 ELSE 0 END) AS n',id)),' FROM cia_ensures ce LEFT JOIN policies p on ce.id = p.cia_ensure_id INNER JOIN policy_business_units pb ON pb.id = p.policy_business_unit_id INNER JOIN comercial_areas ca ON ca.id = pb.comercial_area_id AND ca.id=1 Group by p.policy_business_unit_id') from cia_ensures where id in(1,2,3,4,5);") 
     @result2 = ActiveRecord::Base.connection.execute("prepare stmt from @sql;") 
     @result3 = ActiveRecord::Base.connection.execute("execute stmt;") 
    end 

end 

-Created보기 : 여기

<% @result.each do |policy| %> 
    <%= policy.try(:unit) %> 
    <%= policy.try(:v1) %> 
<% end %> 

로그입니다 :

SQL (0.9ms) select distinct @sql := concat('SELECT pb.name as unit,',group_concat(concat('SUM(CASE WHEN p.state =0 AND ce.id=',id,' THEN 1 ELSE 0 END) AS v',id,',SUM(CASE WHEN p.state =1 AND ce.id=',id,' THEN 1 ELSE 0 END) AS a',id,',SUM(CASE WHEN p.state =2 AND ce.id=',id,' THEN 1 ELSE 0 END) AS n',id)),' FROM cia_ensures ce LEFT JOIN policies p on ce.id = p.cia_ensure_id INNER JOIN policy_business_units pb ON pb.id = p.policy_business_unit_id INNER JOIN comercial_areas ca ON ca.id = pb.comercial_area_id AND ca.id=1 Group by p.policy_business_unit_id') from cia_ensures where id in(1,2,3,4,5); 
SQL (0.9ms) prepare stmt from @sql; 
SQL (0.2ms) execute stmt; 

그리고 내가보기에이 오류를 가지고 :

undefined method `unit' for #<Array:0x7f0e668cbf88> 

시도에서 값을 변경 내 보기 :

<% @result2.each do |policy| %> 
    <%= policy.try(:unit) %> 
    <%= policy.try(:v1) %> 
<% end %> 

그리고이 오류가 발생했습니다 :

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.each 

다시 내보기에서 값을 변경 시도 :

<% @result3.each do |policy| %> 
    <%= policy.try(:unit) %> 
    <%= policy.try(:v1) %> 
<% end %> 

그리고이 오류 가지고 :

undefined method `unit' for #<Array:0x7f0e66b67aa8> 

시도 다시 변경 값에서을 이것에 대한 나의 견해 :

<% @result3.each do |policy| %> 
    <%= policy.try(:unit) %> 
    <%= policy.try(:v1) %> 
<% end %> 

내 쿼리에서 값을 표시하거나 가져올 수 없으며 값을 표시 할 수있는 방법이 있습니까? 이 코드는 작동하지만 어떻게 라인을 많이 작성하지 않고 모든 것을 보여주기 위해 할 수있는 친구와 함께 따르면

UNIT V1 A1 N1 V2 A2 N2 V3 A3 N3 V4 A4 N4 V5 A5 N5 
LIFE 2 0 0 1 2 0 0 0 0  0 0 0 0 0 0 
ROB 0 1 0 0 1 2 0 0 0  0 0 0 0 0 0 

?
<% @result3.each do |policy| %> 
    <%= policy[0] %> 
    <%= policy[1] %> 
    <%= policy[2] %> 
    <%= policy[3] %> 
    <%= policy[4] %> 
    <%= policy[5] %> 
    <%= policy[6] %> 
    <%= policy[7] %> 
    .... 
<%end%> 

나는 값을 얻을 수 없다 여전히 답을 찾는없이 일개월 보내 주시기 바랍니다.

누군가 제발 도와 줄 수 있습니까?

정말 감사하겠습니다.

답변

1

나는 쿼리를 실행하기 때문에 @result3이 원하는 것이라고 생각합니다.

undefined method `unit' for #<Array:0x7f0e66b67aa8> 

try 개체가 nil이 아닌 것으로 판명 이야기, 그리고 개체에 #unit 메소드를 호출하려고합니다. MySQL 결과 세트로는 작동하지 않을 것 같습니다.

은 내가 mysql2을 사용한 적이 있지만, 빠른 구글은 결과 객체가 배열과 같은 열 이름의 키 또는 바로 바로 숫자 인덱스와 해시 같은 개체를 보여줍니다 때문에,이 같은 시도 :

<% @result3.each do |policy| %> 
    <%= policy['unit'] %> 
    <%= policy['v1'] %> 
<% end %> 

또는

<% @result3.each do |policy| %> 
    <%= policy['UNIT'] %> 
    <%= policy['V1'] %> 
<% end %> 

또는

<% @result3.each do |policy| %> 
    <%= policy[0] %> 
    <%= policy[1] %> 
<% end %> 

그리고 문제가 해결되지 않을 경우, t에서

그는 적어도 당신이 돌아 오는 것을보기 위해 이것을 시도하십시오.

<% @result3.each do |policy| %> 
    <%= policy.inspect %> 
<% end %> 
+1

다행입니다. 그래, 숫자가 좋지 않아, 난뿐만 아니라 열에 대한 문자열 키를 것이라고 생각합니다. 마지막 제안을'<% = policy.inspect %>'로 시도해보십시오. 객체를 덤프하고 모든 것을 보여 주면 도움이 될 것입니다. –

+1

[문서] (http://rubydoc.info/gems/mysql2/0.3.15/frames)에 따르면 결과 행 객체에는 몇 가지 유용한 정보를 제공하는'fields' 메소드가 있어야합니다. –

+0

'inspect'는 실제 사용하기를 원하는 것이 아니며 단지 디버깅 도구 일뿐입니다. –