Como recoger los datos de una consulta con find_by_sq

buenas.

tengo un pequeño problema con la extraccion de datos de un array es
decir.

estoy ejecutando la siguiente consulta

@evento = Evento.find_by_sql(“select e.perdida_carga, e.permanencia,
e.fases, tc.descripcion
from eventos e join tipo_causas tc on e.tipo_causas_id = tc.id
where e.id = #{@informe_falla.id}”)

y quiero meter los datos resultantes de la consulta en campos de texto
en mi formulario rhtml de la siguiente manera

Permanencia <% @permanencia='' if @evento.permanencia @permanencia [email protected] end end %> " />
</td>

me da el siguiente error

NoMethodError in informe_fallas#edit
undefined method `perdida_carga’ for #Array:0x47d3850

que es la pag donde hago la consulta y quiero mostrar la data de la
misma.

estoy usando una expresion no adecuada para leer datos de un array
formado con el find_by_sql, que puedo utilizar para sacar esos datos de
alli, me estoy trayendo un solo registro con el join.

gracias por su tiempo

2008/2/22 Jesus M. [email protected]:

  where e.id = #{@informe_falla.id}")
      @permanencia=''

alli, me estoy trayendo un solo registro con el join.

gracias por su tiempo

Hola
Jesús,
Como bien has dicho, find_by_sql te devuelve un array. Si estás seguro
de que sólo devuelve una fila (no lleva “limit 1” así que no
tendríapor qué), puedes hacer algo como:

@evento = Evento.find_by_sql(“BLA BLA BLA”).first

De todas maneras y si no me equivoco, esa consulta concreta puedes
hacerla fácil con un find normal y las opciones pertinentes (y alguna
relación declarada en el modelo). Tu código ganaría bastante en
legibilidad, creo.

Otra forma de ganar legibilidad, ya que estamos (y esto es sólo una
opinión personal) es sacar toda esa lógica del controlador y llevarla
al modelo (al fin y al cabo es lógica de manejo de datos). Yo
personalmente acostumbro a no hacer en el controlador más que find
triviales, y en caso de necesitar algo más complejo, llevarlo al
modelo:

en el modelo

def self.find_lo_que_sea
find(BLA BLA BLA)
end

en el controlador

@evento = Evento.find_lo_que_sea

Otra cosa, es recomendable usar siempre el mecanismo que ActiveRecord
trae para sanitizar consultas SQL, que también funciona con
find_by_sql. Tu consulta quedaría tal que
así:
Evento.find_by_sql([“select e.perdida_carga, e.permanencia,
e.fases, tc.descripcion
from eventos e join tipo_causas tc on e.tipo_causas_id = tc.id
where e.id = ?”, @informe_falla.id])

Espero que te sirva, un saludo


Sergio Gil Pérez de la Manga
e-mail > [email protected]
blog > http://www.lacoctelera.com/porras

Sergio Gil Pérez de la Manga wrote:

2008/2/22 Jesus M. [email protected]:

  where e.id = #{@informe_falla.id}")
      @permanencia=''

alli, me estoy trayendo un solo registro con el join.

gracias por su tiempo

Hola
Jes�s,
Como bien has dicho, find_by_sql te devuelve un array. Si est�s seguro
de que s�lo devuelve una fila (no lleva “limit 1” as� que no
tendr�apor qu�), puedes hacer algo como:

@evento = Evento.find_by_sql(“BLA BLA BLA”).first

De todas maneras y si no me equivoco, esa consulta concreta puedes
hacerla f�cil con un find normal y las opciones pertinentes (y alguna
relaci�n declarada en el modelo). Tu c�digo ganar�a bastante en
legibilidad, creo.

Otra forma de ganar legibilidad, ya que estamos (y esto es s�lo una
opini�n personal) es sacar toda esa l�gica del controlador y llevarla
al modelo (al fin y al cabo es l�gica de manejo de datos). Yo
personalmente acostumbro a no hacer en el controlador m�s que find
triviales, y en caso de necesitar algo m�s complejo, llevarlo al
modelo:

en el modelo

def self.find_lo_que_sea
find(BLA BLA BLA)
end

en el controlador

@evento = Evento.find_lo_que_sea

Otra cosa, es recomendable usar siempre el mecanismo que ActiveRecord
trae para sanitizar consultas SQL, que tambi�n funciona con
find_by_sql. Tu consulta quedar�a tal que
as�:
Evento.find_by_sql([“select e.perdida_carga, e.permanencia,
e.fases, tc.descripcion
from eventos e join tipo_causas tc on e.tipo_causas_id = tc.id
where e.id = ?”, @informe_falla.id])

Espero que te sirva, un saludo


Sergio Gil P�rez de la Manga
e-mail > [email protected]
blog > http://www.lacoctelera.com/porras


gracias por la pronta respuesta y la recomendacion, el detalle con la
consulta es que me trae todas las filas que estan en el join pero no se
como sacar los valores del array que retorna. el array es de solo 1
registro porque la condicion es un campo clave unico.

gracias si me sirvio el .first ya hice la prueba con el y me resulto.

Hola…

Si entendí bien lo que quieres hacer, creo que estás escribiendo mucho
código para hacerlo,
en el controller bastaría con :

@evento = Evento.find(@informe_falla.id)

y en el rhtml recuperas los datos:

permanencia = @evento.permanencia
causa = @evento.tipo_causa.descripcion

estoy suponiendo que existe la ralación entre Evento y TipoCausa

def Evento
belongs_to :tipo_causa
end

def TipoCausa
has_many :evento
end

El día 22/02/08, Jesus M. [email protected]
escribió:

  from eventos e join tipo_causas tc on e.tipo_causas_id = tc.id
<%
formado con el find_by_sql, que puedo utilizar para sacar esos datos de


Saludos
Atte

Jean Marcel Droguett A.