Agregar consultas SQL adicionales en una vista central de Redmine (anulando la vista en el complemento)
-
05-07-2019 - |
Pregunta
Estoy anulando una vista central de Redmine en mi plugin (/views/reports/_details.rhtml). Solo para imprimir algunos datos adicionales, como cuántos problemas abiertos se asignan y no se asignan.
Intenté anular el controlador y agregar un método para hacer esto, pero nunca lo hice funcionar, así que agregué el siguiente código a la vista (sí, es feo, pero la página rara vez se usará).
Ahora, para mi problema, la vista se repite en todos los rastreadores (row.id) y muestra información, como cuántos problemas están abiertos y cerrados. Así que he agregado una consulta SQL adicional, pero solo funciona para la primera iteración del rastreador, para el resto muestra los mismos datos una y otra vez.
Cuando miro el archivo development.log solo hay una consulta SQL. Pero cuando imprimo row.id (& Lt;% = row.id% & Gt;) muestra el valor correcto para cada rastreador.
¿Cómo debo resolver esto?
Código en _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") %>
Consulta SQL en 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 usé Ruby on Rails o Redmine antes ...)
Solución
Lo resolví agregando dos consultas SQL (en la vista) que seleccionan todos los problemas del proyecto seleccionado.
<% @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") %>
Entonces lo uso.
<%= aggregate_link @all_unsigned_issues, { "tracker_id" => row.id, "status" => 5 },
:controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)) %>