Problema con ActiveScaffold

Hola a todos, soy nueva con ROR y ActiveScaffold y tengo un problema:

Tengo 3 trablas: Ciudades, Casas y Personas. La primera esta relacionada
con la segunda y la segunda con la tercera.

Cuando visualizo la tabla casas, en cada fila, en el campo ciudad en vez
de mostrase el nombre de la ciudad a la que pertenece la casa, me
aparece esto: #Ciudad:0xb779a448
donde el numéro va cambiando.

Quería saber también si al visualizar la tabla personas, ademas de
visualizarse los atributos de las personas y la casa a la que
pertenecen, se puede visualizar también la ciudad a la que pertenecen.

Muchas gracias.

On 4/19/07, Maria [email protected] wrote:

Hola a todos, soy nueva con ROR y ActiveScaffold y tengo un problema:

Hola María, bienvenida!

Tengo 3 trablas: Ciudades, Casas y Personas. La primera esta relacionada
con la segunda y la segunda con la tercera.

Es más cool hablar de “modelos” :wink:
Las tablas son un mecanismo de persistencia (o entre nosotros, un mal
necesario!)

Cuando visualizo la tabla casas, en cada fila, en el campo ciudad en vez
de mostrase el nombre de la ciudad a la que pertenece la casa, me
aparece esto: #Ciudad:0xb779a448
donde el numéro va cambiando.

Cuando hacés esto:

<%= casa.ciudad %>

Se está llamando implícitamente al método to_s sobre el objeto que vas
a imprimir. Por defecto, el método to_s devuelve el nombre de la clase
y la su dirección de memoria (no?). A mí me encanta sobreescribir este
método porque me parece mucho más DRY (Don’t Repeat Yourself). Es
decir, es responsabilidad del modelo devolver una
representación"humana" (string) de sus datos:

class Ciudad < ActiveRecord::Base
def to_s
nombre
end
end

Eso también se puede lograr con un alias_method, pero también podrías hacer:

def to_s
“#{nombre}, #{pais}”
end

(suponiendo que hay una relación con países)

Espero que haya servido.

Saludos!

On 4/19/07, Maria [email protected] wrote:

Me queda por entender, teniendo los 3 modelos, el primero relacionado
con el segundo y el segundo con el tercero, al visualizar la tabla
correspondiente al tercer modelo con ActiveScaffold cómo se puede
obtener, además de los atributos del tercer modelo y el atributo del
segundo momdelo con el que está realacionado, un campo del primer modelo
con el que está relacionado.

Dos opciones:

<%= persona.casa.ciudad %>

O algo más relacionado al modelo de datos:

class Persona < ActiveRecord::Base
belongs_to :casa

def ciudad
casa.ciudad unless casa.nil?
end
end

Y luego

<%= persona.ciudad %>

En este caso creo que la segunda opción es más correcta.

Saludos!

Muchas gracias,

el error que tenía ya está solucionado y entendido.

Me queda por entender, teniendo los 3 modelos, el primero relacionado
con el segundo y el segundo con el tercero, al visualizar la tabla
correspondiente al tercer modelo con ActiveScaffold cómo se puede
obtener, además de los atributos del tercer modelo y el atributo del
segundo momdelo con el que está realacionado, un campo del primer modelo
con el que está relacionado.

Damian J. wrote:

On 4/19/07, Maria [email protected] wrote:

Hola a todos, soy nueva con ROR y ActiveScaffold y tengo un problema:

Hola Mar�a, bienvenida!

Tengo 3 trablas: Ciudades, Casas y Personas. La primera esta relacionada
con la segunda y la segunda con la tercera.

Es m�s cool hablar de “modelos” :wink:
Las tablas son un mecanismo de persistencia (o entre nosotros, un mal
necesario!)

Cuando visualizo la tabla casas, en cada fila, en el campo ciudad en vez
de mostrase el nombre de la ciudad a la que pertenece la casa, me
aparece esto: #Ciudad:0xb779a448
donde el num�ro va cambiando.

Cuando hac�s esto:

<%= casa.ciudad %>

Se est� llamando impl�citamente al m�todo to_s sobre el objeto que vas
a imprimir. Por defecto, el m�todo to_s devuelve el nombre de la clase
y la su direcci�n de memoria (no?). A m� me encanta sobreescribir este
m�todo porque me parece mucho m�s DRY (Don’t Repeat Yourself). Es
decir, es responsabilidad del modelo devolver una
representaci�n"humana" (string) de sus datos:

class Ciudad < ActiveRecord::Base
def to_s
nombre
end
end

Eso tambi�n se puede lograr con un alias_method, pero tambi�n podr�as hacer:

def to_s
“#{nombre}, #{pais}”
end

(suponiendo que hay una relaci�n con pa�ses)

Espero que haya servido.

Saludos!

Pero no lo puedo hacer desde el controlador?

Ahora hago desde el controlador de personas:

config.columns = [:nombre, :apellido, :casa]

Gracias.

Damian J. wrote:

On 4/19/07, Maria [email protected] wrote:

Me queda por entender, teniendo los 3 modelos, el primero relacionado
con el segundo y el segundo con el tercero, al visualizar la tabla
correspondiente al tercer modelo con ActiveScaffold c�mo se puede
obtener, adem�s de los atributos del tercer modelo y el atributo del
segundo momdelo con el que est� realacionado, un campo del primer modelo
con el que est� relacionado.

Dos opciones:

<%= persona.casa.ciudad %>

O algo m�s relacionado al modelo de datos:

class Persona < ActiveRecord::Base
belongs_to :casa

def ciudad
casa.ciudad unless casa.nil?
end
end

Y luego

<%= persona.ciudad %>

En este caso creo que la segunda opci�n es m�s correcta.

Saludos!

On 4/19/07, Maria [email protected] wrote:

Pero no lo puedo hacer desde el controlador?

Ahora hago desde el controlador de personas:

config.columns = [:nombre, :apellido, :casa]

Gracias.

Con la segunda opción que te dije, agregando el método ciudad, podrías hacer:

config.columns = [:nombre, :apellido, :casa, :ciudad]

On 4/20/07, Maria [email protected] wrote:

-Que se me muestre en el ascensor donde selecciono la casa, en vez de
sólo el nombre de la casa el nombre de la ciudad+el nombre de la casa.
Al seleccionar una casa que esta en una ciudad, se me relacionará la
persona con esa casa que está en dicha ciudad.

En reaildad nunca usé ActiveScaffold. Solamente vi un poco de
AjaxScaffold pero no en profundidad.

Así que la solución más rápida me parece hacer algo parecido a lo anterior:

def nombre_completo
[ciudad, nombre].compact.join(’ - ')
end

Y luego en la lista utilizás el método nombre_completo.

Espero que haya servido!

Saludos@

Muchas gracias por todo,

Ya que veo que sabes mucho de esto te pregunto una úlima cosa, porque
estoy bastante perdida.

Permite el ActiveScaffold hacer codas del estilo de:

Por ejemplo, en la prueba que estoy haciendo tengo 3 modelos en la base
de datos: CIUDAD relacionado con CASA (relación 1-n) este relacionado
con PERSONA (relación 1-n).

Cuando voy a insertar o editar una nueva persona tengo que seleccionar
una casa. Puede pasar que tenga varias casas iguales que pertenezcan a
diferente ciudad.
En este caso a mi se me ocurren dos opciones:

-Que se me muestre en el ascensor donde selecciono la casa, en vez de
sólo el nombre de la casa el nombre de la ciudad+el nombre de la casa.
Al seleccionar una casa que esta en una ciudad, se me relacionará la
persona con esa casa que está en dicha ciudad.

-Que tenga dos asensores, uno con las ciudades y otro con las casas. Si
selecciono una ciudad, se refrescara el ascensor de las casas y
aparecerán solo las casas que pertenecen a esta ciudad. Si hubiera
elegido una casa, en el ascensor de las ciudades se me quedaría
seleccionado el nombre de la ciudad.

No se si es posible hacer estas cosas con ActiveScaffold, es algo que se
puede necesitar hacer en cualquier momento.

Otra cosa, conoces algún libro de ROR que trate sobre ActiveScaffold (o
la versión anterior, AjaxScaffold)? Qué libro me recomiendad para
aprender ROR. Yo ahora estoy usando “Agile Web development with Rails”

Muchas gracias por todo.

Tengo 3 trablas: Ciudades, Casas y Personas. La primera esta relacionada
con la segunda y la segunda con la tercera.

Sí, ya he visto en la documentación lo del to_label. Muchas gracias por
la ayuda.

Lo que no entiendo es una cosa. Con lo que me dijiste, cuando visualizo
las personas me aparecen también la ciudad a la que pertenecen, pero no
puedo ordenar por ese campo. Según he visto en la documentación, creo
que tengo que usar sort o/y sort_by, y la verdad es que no me entero
mucho.

Lo que no entiendo es porque no puedo ordenar por ese campo, si ya tiene
todos los datos, no?

Manu C. wrote:

Con ActiveScaffold, habria que declarar antes un metodo to_label, mejor
que
reescribir el metodo to_s. de la documentacion de activescaffold:

to_label

“When ActiveScaffold needs to present a string description of a
record, it searches through a common list of record properties looking
for something that responds. The search set, in order, is: :to_label,
:name, :label, :title, and finally :to_s. So if your schema already
has one of those fields, it’ll be automatically used. But you can
always define a to_label method to customize the string description.”

Saludos.

El 19/04/07, Damian J. [email protected]
escribi�:

Con ActiveScaffold, habria que declarar antes un metodo to_label, mejor
que
reescribir el metodo to_s. de la documentacion de activescaffold:

to_label

“When ActiveScaffold needs to present a string description of a
record, it searches through a common list of record properties looking
for something that responds. The search set, in order, is: :to_label,
:name, :label, :title, and finally :to_s. So if your schema already
has one of those fields, it’ll be automatically used. But you can
always define a to_label method to customize the string description.”

Saludos.

El 19/04/07, Damian J. [email protected]
escribió:

Por ejemplo, si tienes el modelo persona y dentro de esta el atributo
ciudad_nacimiento.

En el controlador de persona pones:

config.columns[:ciudad_nacimiento].ui_type = :select

Y te saldrá ciudad_nacimiento como un combobox.

unknown wrote:

Hola,
estoy empezando a conocer ActiveScaffold. Me gusta y quiero utilizarlo.
En un modelo tengo un tipo de datos enum. Me gustar�a que a la hora de
editarlo o crearlo, me aparec�era un combobox con las opciones del enum.
C�mo puedo hacer eso??? ahora mismo me sale como un campo de texto.
Saludos y gracias por adelantado.
Ana

Gracias Maria,
eso ya lo había probado y no me funciona.
He comprobado que no me funciona lo de ui_type tampoco con :text_area,
ni
con ningún otro tipo. Siempre me muestra un textfield.
Qué puedo tener mal???
Este tipo de cosas que deberían ser tan sencillas, me desesperan cuando no
funcionan…

Hola,
estoy empezando a conocer ActiveScaffold. Me gusta y quiero utilizarlo.
En un modelo tengo un tipo de datos enum. Me gustaría que a la hora de
editarlo o crearlo, me aparecíera un combobox con las opciones del enum.
Cómo puedo hacer eso??? ahora mismo me sale como un campo de texto.
Saludos y gracias por adelantado.
Ana

Hola
el tipo enum no es soportado por ActiveRecord, si puedes modificar la
definicion de la tabla debería modificarla para usar una tabla “comun”
id →
option. Si no puedes modificarla hay un plugin para usar enums[1], nunca
lo
he usado pero puedes probarlos no parece nada complicado.

[1] - http://enum-column.rubyforge.org/

Saludos
Hernán Fernandez
netflux.com.ar

Damian J. wrote:

On 4/19/07, Maria [email protected] wrote:

Hola a todos, soy nueva con ROR y ActiveScaffold y tengo un problema:

Hola Mar�a, bienvenida!

Tengo 3 trablas: Ciudades, Casas y Personas. La primera esta relacionada
con la segunda y la segunda con la tercera.

Es m�s cool hablar de “modelos” :wink:
Las tablas son un mecanismo de persistencia (o entre nosotros, un mal
necesario!)

Cuando visualizo la tabla casas, en cada fila, en el campo ciudad en vez
de mostrase el nombre de la ciudad a la que pertenece la casa, me
aparece esto: #Ciudad:0xb779a448
donde el num�ro va cambiando.

Cuando hac�s esto:

<%= casa.ciudad %>

Se est� llamando impl�citamente al m�todo to_s sobre el objeto que vas
a imprimir. Por defecto, el m�todo to_s devuelve el nombre de la clase
y la su direcci�n de memoria (no?). A m� me encanta sobreescribir este
m�todo porque me parece mucho m�s DRY (Don’t Repeat Yourself). Es
decir, es responsabilidad del modelo devolver una
representaci�n"humana" (string) de sus datos:

class Ciudad < ActiveRecord::Base
def to_s
nombre
end
end

Eso tambi�n se puede lograr con un alias_method, pero tambi�n podr�as hacer:

def to_s
“#{nombre}, #{pais}”
end

(suponiendo que hay una relaci�n con pa�ses)

Espero que haya servido.

Saludos!

Hola algo muy parecido me ha sucedido pero lo he solucionado definiendo
dentro de mi modelo def to_s, al intentar mostrar el id de un
determinada tabla lo que obtengo en la celda correspondiente es lo
siguiente:
ame, label, title, to_s

Alguien por favor me puede dar una mano? De antemano muchas gracias!

Ernesto Chávez aliaga escribió:

con la segunda y la segunda con la tercera.

end

Hola algo muy parecido me ha sucedido pero lo he solucionado definiendo
dentro de mi modelo def to_s, al intentar mostrar el id de un
determinada tabla lo que obtengo en la celda correspondiente es lo
siguiente:
ame, label, title, to_s

Alguien por favor me puede dar una mano? De antemano muchas gracias!

Si por ejemplo quieres mostrar el id en los listados, debes poner en la
configuración de AS(dentro del bloque):

config.list.columns.add :id

La línea anterior lo añade al final, si lo quieres al principio(o en una
posición determinada) y que salga en todas las acciones, deberías
especificar las columnas visibles:

config.columns = [:id, :col1, :col2, …]

Si solo lo quieres en el listado:

config.list.columns = [:id, :col1, :col2, …]

Saludos!

Ernesto Chávez aliaga escribió:

dentro de mi modelo def to_s, al intentar mostrar el id de un
config.list.columns.add :id
config.list.columns = [:id, :col1, :col2, …]
modelo contrato
Dentro de los modelos he declarado lo siguiente para las relaciones
el nombre del cliente asociado al contrato.
end

obtengo en el campo contrato lo siguiente name, label, title, to_s,
name, label, title, to_s

Como hago para poder ver el id del contrato dentro del listado de
clientes?
Muchas gracias por su tiempo.

En mis modelos para cambiar su salida redefino el método name pero por
lo que he comprobado es lo mismo (debo mirar el porque):

def name
“#{id}”
end

Además, fíjate que estoy poniéndolo entre comillas, así sí te mostrará
el id del contrato.

Saludos!

Rafael García wrote:

Ernesto Chávez aliaga escribió:

con la segunda y la segunda con la tercera.

end

Hola algo muy parecido me ha sucedido pero lo he solucionado definiendo
dentro de mi modelo def to_s, al intentar mostrar el id de un
determinada tabla lo que obtengo en la celda correspondiente es lo
siguiente:
ame, label, title, to_s

Alguien por favor me puede dar una mano? De antemano muchas gracias!

Si por ejemplo quieres mostrar el id en los listados, debes poner en la
configuración de AS(dentro del bloque):

config.list.columns.add :id

La línea anterior lo añade al final, si lo quieres al principio(o en una
posición determinada) y que salga en todas las acciones, deberías
especificar las columnas visibles:

config.columns = [:id, :col1, :col2, …]

Si solo lo quieres en el listado:

config.list.columns = [:id, :col1, :col2, …]

Saludos!

Primero que nada le agradezco por su tiempo y le comento que soy
relativamente nuevo en el tema de RoR. A continuación le describo de
manera mucho mas detallada mi situación.
tengo 2 modelos y dos controladores

modelo cliente
modelo contrato

Para ambos estoy usando activescaffold.
los atributos dentro de mi base de datos son los siguientes
clientes.
nombre
direccion
telefono
contratos.
cliente_id
otros atributos
Dentro de los modelos he declarado lo siguiente para las relaciones
modelo cliente.
has_many :contrato
def to_s
nombre
end
modelo contrato.
belongs_to :cliente

Al ver el listado de contratos todo va bien. obtengo ademas de los datos
del contrato
el nombre del cliente asociado al contrato.

Sin embargo al intentar mostrar el id del contrato el el listado de
clientes
obtengo lo siguiente en el campo que corresponde al contrato

#Contrato:0xb75c1450, #Contrato:0xb75c1130

al definir en el modelo contrato lo siguiente
def to_s
id
end

obtengo en el campo contrato lo siguiente name, label, title, to_s,
name, label, title, to_s

Como hago para poder ver el id del contrato dentro del listado de
clientes?
Muchas gracias por su tiempo.