Adicionando consultas SQL extras em uma visão núcleo Redmine (substituindo vista no plugin)
-
05-07-2019 - |
Pergunta
I'am primordial uma Redmine vista núcleo no meu plugin (/views/reports/_details.rhtml). Apenas para imprimir alguns dados extras, como quantas questões abertas são atribuídos e não atribuídos.
Eu tentei substituir o controlador, em vez e adicionar um método para fazer isso, mas eu nunca tenho que trabalhar, então eu adicionei o código abaixo à vista (sim, é feio, mas a página raramente por se usado).
Agora, para o meu problema, a vista são looping trough todos os trackers (row.id) e mostrando informações, como quantas questões são abertas e fechadas. Então eu adicionei uma consulta SQL extra, mas ele só funciona para a primeira iteração tracker, para o resto mostra os mesmos dados uma e outra vez.
Quando eu olhar para o development.log há apenas uma consulta SQL nele. Mas quando eu row.id saída (<% = row.id%>) mostra o valor correto para cada rastreador.
Como eu deveria resolver isso?
Código em _details.rhtml
<% @total_assigned_and_open ||=
ActiveRecord::Base.connection.select_all("select count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{Tracker.table_name} t
where
i.status_id=s.id
and i.tracker_id=#{row.id}
and i.project_id=#{@project.id}
and i.assigned_to_id is null
and s.is_closed = 0
group by s.id, s.is_closed, t.id limit 1") %>
SQL consulta no development.log
select count(i.id) as total
from
issues i, issue_statuses s, trackers t
where
i.status_id=s.id
and i.tracker_id=1
and i.project_id=1
and i.assigned_to_id is null
and s.is_closed = 0
group by s.id, s.is_closed, t.id limit 1
(Nunca usado Ruby on Rails ou Redmine antes ...)
Solução
Eu resolvi-lo adicionando duas consultas SQL (na visão), que seleciona todas as questões para o projeto selecionado.
<% @all_unsigned_issues ||=
ActiveRecord::Base.connection.select_all("select i.status_id as status, s.is_closed as
closed, t.id as tracker_id, count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{Tracker.table_name} t
where
i.assigned_to_id is null
and i.project_id=#{@project.id}
and i.status_id=s.id
and i.tracker_id=t.id
group by i.id") %>
Em seguida, use I.
<%= aggregate_link @all_unsigned_issues, { "tracker_id" => row.id, "status" => 5 },
:controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)) %>