agusgambina agusgambina - 7 months ago 10
Ruby Question

Rails refresh a page web view from a dynamic from the database

I have a dynamic view in my database. I am using Postgres and this is my view

CREATE VIEW CONSULTANTS_CLIENTS_TASKS AS
SELECT
concat_ws(' ', consultants.first_name, consultants.last_name) as consultant_name,
clients.name as client_name,
tasks.name as task_name,
tasks.init_time::date as task_date,
EXTRACT (epoch FROM tasks.finish_time - tasks.init_time)/3600 as task_duration,
consultants_select.consultant_cost_per_hour * (EXTRACT (epoch FROM tasks.finish_time - tasks.init_time))/3600 as consultant_cost,
clients_select.client_amount_per_hour * (EXTRACT (epoch FROM tasks.finish_time - tasks.init_time))/3600 as client_amount,
task_related_costs_per_hour * (EXTRACT (epoch FROM tasks.finish_time - tasks.init_time))/3600 as task_cost_related
FROM consultants
INNER JOIN tasks ON consultants.id = tasks.consultant_id
INNER JOIN clients ON tasks.client_id = clients.id
INNER JOIN
(SELECT
consultants.id as consultant_id,
salaries.payment / (extract(epoch from sum(tasks.finish_time - tasks.init_time)) / 3600) as consultant_cost_per_hour
FROM consultants
INNER JOIN tasks ON consultants.id = tasks.consultant_id
INNER JOIN salaries ON consultants.id = salaries.consultant_id
GROUP BY consultants.id, to_char(salaries.payment_date, 'yyyy-mm'), salaries.payment
ORDER BY consultant_id) AS consultants_select ON consultants.id = consultants_select.consultant_id
INNER JOIN
(SELECT
clients.id as client_id,
amount_client_month.amount_client / worked_client_month.worked_hours as client_amount_per_hour
FROM
(SELECT
clients.id as client_id,
to_char(purchases.date, 'yyyy-mm') as client_year_month,
SUM(products.price) as amount_client
FROM clients
INNER JOIN purchases ON purchases.client_id = clients.id
INNER JOIN products ON purchases.product_id = products.id
GROUP BY clients.id, to_char(purchases.date, 'yyyy-mm')
ORDER BY clients.id) AS amount_client_month
INNER JOIN
(SELECT
clients.id as client_id,
to_char(tasks.init_time::date, 'yyyy-mm') as month,
SUM(extract(epoch from (tasks.finish_time - tasks.init_time))) / 3600 as worked_hours
FROM tasks
INNER JOIN clients ON clients.id = tasks.client_id
GROUP BY clients.id, to_char(tasks.init_time::date, 'yyyy-mm')) as worked_client_month
ON amount_client_month.client_id = worked_client_month.client_id
INNER JOIN clients ON worked_client_month.client_id = clients.id) AS clients_select ON clients.id = clients_select.client_id
INNER JOIN
(SELECT
tasks.id as task_id,
SUM(costs.amount) as task_related_costs_per_hour
FROM costs
INNER JOIN task_costs ON costs.id = task_costs.cost_id
INNER JOIN tasks ON task_costs.task_id = tasks.id
GROUP BY tasks.id) AS tasks_select ON tasks.id = tasks_select.task_id;


Inside views I have the folder
reports\consultants_clients_tasks


<h1>Report: ConsultantsClientsTasks</h1>

<table class="table">
<thead>
<tr>
<th>consultant_name</th>
<th>client_name</th>
<th>task_name</th>
<th>task_date</th>
<th>task_duration</th>
<th>consultant_cost</th>
<th>client_amount</th>
<th>task_cost_related</th>
<th colspan="3"></th>
</tr>
</thead>

<tbody>
<% @consultants_clients_tasks.each do |co| %>
<tr>
<td><%= co.consultant_name %></td>
<td><%= co.client_name %></td>
<td><%= co.task_name %></td>
<td><%= co.task_date %></td>
<td><%= co.task_duration %></td>
<td><%= co.consultant_cost %></td>
<td><%= co.client_amount %></td>
<td><%= co.task_cost_related %></td>
</tr>
<% end %>
</tbody>
</table>


Inside controllers I have a folder call
reports
with the file
consultants_clients_tasks_controller.rb


class Reports::ConsultantsClientsTasksController < ApplicationController
def index
@consultants_clients_tasks = ConsultantsClientsTask.all
end
end


Inside models I have the folder
reports
with the file
consultants_clients_task.rb


module ReadOnlyModel
extend ActiveSupport::Concern
class Reports::ConsultantsClientsTask < ActiveRecord::Base
self.table_name = "consultants_clients_tasks"
end
end


and in the routes files I added

namespace :reports do
get 'consultants_clients_tasks/index'
end


The first time I load into the page all works fine, the problem is when I refresh the page I get this errors

enter image description here

Answer

The error is obvious as you are using a wrong class name. You need to change

@consultants_clients_tasks = ConsultantsClientsTask.all

to

@consultants_clients_tasks = Reports::ConsultantsClientsTask.all