Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Ruby (http://www.forosdelweb.com/f105/)
-   -   Mi primer aplicacion (http://www.forosdelweb.com/f105/mi-primer-aplicacion-577569/)

ruddyvar 18/04/2008 15:50

Mi primer aplicacion
 
Hola compañeros, una consulta. Estoy iniciandome y tengo una pequeña aplicación

Tenemos una duda con Ruby. Hemos hecho una clase con un método para hacer la consulta, lo llamamos desde el controler y mostramos el resultado en la vista. Sé que los llamados están bien porque ya lo probamos y la consulta SQL también está probada.

El error que nos sales es que nos estada devolviendo un nil, pero no sabemos porque.

Creo que lo que nos falta es el mapeo del resultado de la consulta a la clase.

Modelo:

class ProjectTimeReport
class << self

def create_report
@report = ProjectTimeReport.find_by_sql "SELECT e.EMPNAME,t.TIMEACTDATE, t.TIMEACTDURATION, t.TIMEACTNOTE, t.TIMEACTTYPE, c.CUSJOBNAME
FROM TIMEACT t , CUSTOMERJOB c , EMPLOYEE e
WHERE t.TIMEACTJOB = c.CUSJOBLISTID AND
t.TIMEACTJOB = '3700000-1136566007' AND
t.TIMEACTEMP =e.EMPLISTID AND
t.TIMEACTDURATION <> 0
Order BY e.EMPNAME, t.TIMEACTDATE"
end
end
end

Control

def project_time_report
@report = ProjectTimeReport.new hola
@report.resource = "ruddy vargas"

#@employees = Employee.find(:all)

respond_to do |format|
format.html # project_time_report.html.erb
format.xml { render :xml => @report}
end
end

vista

<tr>
<td><%=h @report.EMPNAME %></td>
</tr>

El error:

Showing reports/projectTimeReport.html.erb where line #14 raised:

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.EMPNAME

Extracted source (around line #14):

11:
12:
13: <tr>
14: <td><%=h @report.EMPNAME %></td>
15: </tr>
16:
17:

eagoweb2 22/04/2008 07:56

Re: Mi primer aplicacion
 
porque en el modelo pones class << self???, no seria mejor dejarlo sin eso??

en el controlador estas creadon un record nuevo por lo tanto tienes que dar un save:
@report.save

prueba a ver..

ruddyvar 22/04/2008 09:36

Re: Mi primer aplicacion
 
Gracias eagoweb2.

Veamos si me explico mejor.

Tengo estos Modelos: Employee y Customer
Cada uno tiene su vista y su controlador.

Yo quiero crear un reporte. Entonces tengo la vista y el controlador para el reporte. Tambien he creado una clase llamada report
Esta clase report no tiene una tabla que se relacione con ella. Lo que tengo es un query que me extrae información de las dos tablas.

Ahora mi problema es que no se como pasarle el resultado de la consulta a la clase report.

Veamos. la consulta me trae algo como EMPNAME, CUSTOMERID

son datos de diferentes tablas que los quiero almacenar en un solo objeto y luego en la vista accesarlos.

Muchas gracias.

rdavila 22/04/2008 13:23

Re: Mi primer aplicacion
 
Hola ruddy, en la clase ProjectTimeReport creas un metodo de clase "create_report", pero no lo invocas, deberias reemplazar esto:

@report = ProjectTimeReport.new hola

por:

@report = ProjectTimeReport.create_report

Otra cosa, en la sentencia SELECT que empleas no seleccionas el campo "resource", por tanto no tendras disponible ese atributo en el objeto cuando quieras asignarle un valor, al menos que sea un atributo virtual que lo hayas definido con:

attr_accesor :recource

Saludos.

eagoweb2 22/04/2008 14:24

Re: Mi primer aplicacion
 
Bueno fiajte yo lo haría de la siguiente manera:

tengo mi MVC the Employee y Customer

y solo un controlado de reporte

dentro de ese controlado del reporte defino un metodo

def ver_reporte
// aqui adentro la relacion que quieras hacer de tus otras dos tablas
end

por lo tanto tengo que añadir una vista que se llame ver_reporte.html.erb ó ver_reporte.rhtml :s


el problema puede que esté en la consulta SQL que estas haciendo, ya que no veo ningun parametro que le estés pasando....


Por otro lado no estas usando los 'has_many, belongs_to'??

ruddyvar 23/04/2008 15:01

Re: Mi primer aplicacion
 
Si tengo los belongs_to y los has_many pero la BD es heredada, no podemos correr la migración.

Al hacer esta consutla con el :conditions va a buscar time_id y no existe

@report = Employee.find(:all,
:conditions => ['EMPNAME LIKE ?', '%vargas'],
:include => [:timeact]
)

Da este error:

Mysql::Error: #42000Not unique table/alias: 'EMPLOYEE': SELECT `EMPLOYEE`.`EMPLISTID` AS t0_r0, `EMPLOYEE`.`EMPNAME` AS t0_r1, `EMPLOYEE`.`SSN` AS t0_r2, `EMPLOYEE`.`TYPE` AS t0_r3, `EMPLOYEE`.`CUSJOB` AS t0_r4, `EMPLOYEE`.`SPACEUSED` AS t0_r5, `EMPLOYEE`.`ACTIVE` AS t0_r6, `EMPLOYEE`.`RELEASEDDATE` AS t0_r7, `EMPLOYEE`.`LOGINNAME` AS t0_r8, `TIMEACT`.`TIMEACTDATE` AS t1_r0, `TIMEACT`.`TIMEACTJOB` AS t1_r1, `TIMEACT`.`TIMEACTEMP` AS t1_r2, `TIMEACT`.`TIMEACTTASK` AS t1_r3, `TIMEACT`.`TIMEACTTYPE` AS t1_r4, `TIMEACT`.`TIMEACTDURATION` AS t1_r5, `TIMEACT`.`TIMEACTNOTE` AS t1_r6 FROM `EMPLOYEE` LEFT OUTER JOIN `TIMEACT` ON `TIMEACT`.TIMEACTDATE,TIMEACTJOB,TIMEACTEMP,TIMEAC TTASK,TIMEACTTYPE = `EMPLOYEE`.timeact_id WHERE (EMPNAME LIKE '%vargas')

Me parece que es por no tener el timeact_id, por no correr la migración.

Entonces con este otro query:

@report = Employee.find(:all,
:conditions => ['EMPNAME LIKE ?', '%vargas'],
:joins => "left join TIMEACT ON (EMPLOYEE.EMPLISTID = TIMEACT.TIMEACTEMP)"
)

Si obtengo todos los Employee y los datos de timeact, pero como la consulta la hago con el modelo Employee, ruby me deja los datos del empleado en employee pero no se donde quedan los datos del timeact.

O existe alguna forma para hacer una consulta de dos o mas tablas y que pueda ver todos los datos retornados.

Se me ha ocurrido hacer dos o mas consultas por separado e ir almacenando en una lista, pero no estoy seguro.

gracias.
ruddyvar [email protected]


La zona horaria es GMT -6. Ahora son las 10:03.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.