Problemas al almacenar símbolos en la BD

Tengo el siguiente Array:

ACTIONS = [
:error,
:to_clear,
:to_clear,
:out,
:pass,
:dribbling,
:kick,
:spectacular_pass,
:spectacular_dribbling,
:shoot,
:goal]

Y en un trozo de código de mi programa que hago lo siguiente:

MatchDetail.new({
:player => attack[play],
:club => turn,
:action => MatchDetail::ACTIONS[play],
:minute => last_minute,
} )

Almacena los símbolos así:

— :to_clear

¿Por qué sucede esto?

Carlos Belizón wrote:

¿Por qué sucede esto?

¿Sería mejor almacenar el símbolo como un entero?

On Tue, Jun 16, 2009 at 22:12, Carlos
Belizón[email protected] wrote:

Carlos Belizón wrote:

¿Por qué sucede esto?

¿Sería mejor almacenar el símbolo como un entero?

Lo que sucede es que un símbolo de Ruby no puede ser almacenado en la
base de datos y Rails lo “serializa” en YAML para guardarlo y
recuperarlo. Creo que la solución funciona correctamente, aunque es un
poco Ruby-específica.

Seguro que mucha gente ha encontrado este problema y como
solucionarlo, te recomiendo un paseo por Google.

Suerte.

Daniel R. Troitiño wrote:

Lo que sucede es que un símbolo de Ruby no puede ser almacenado en la
base de datos y Rails lo “serializa” en YAML para guardarlo y
recuperarlo. Creo que la solución funciona correctamente, aunque es un
poco Ruby-específica.

Seguro que mucha gente ha encontrado este problema y como
solucionarlo, te recomiendo un paseo por Google.

Suerte.

El problema es que para recuperar el símbolo he de hacer en todas mis
líneas de código:

YAML.load(Tabla.simbolo)

¿Cómo podría ahorrarme eso en mi modelo?

Xavier N. wrote:

2009/6/16 Carlos Belizón [email protected]:

¿Cómo podría ahorrarme eso en mi modelo?

Por que no usas cadenas? Con %w() te quedaria hasta mas limpio.

Te explico la idea para que tu mismo me digas si lo ves más limpio:

En mi aplicación los partidos contienen comentarios, dichos comentarios
no son más que meras plantillas, en las que se específica que hace cada
jugador en un momento determinado, ya sea un gol, una falta, una tarjeta
amarilla, etc…

Dichas jugadas son siempre las mismas, no varían en el tiempo, de ahí
que pensara en usar símbolos, entre otros motivos para también usar I18l
y que mi aplicación fuera multilenguaje, ¿Crees que es mejor entonces
usar cadenas en lugar de símbolos?

2009/6/16 Carlos Belizón [email protected]:

Suerte.

El problema es que para recuperar el símbolo he de hacer en todas mis
líneas de código:

YAML.load(Tabla.simbolo)

¿Cómo podría ahorrarme eso en mi modelo?

Mirate el método serialize:
http://www.railsbrain.com/api/rails-2.3.2/doc/index.html?a=M002334&name=serialize

Suerte.

2009/6/16 Carlos Belizón [email protected]:

¿Cómo podría ahorrarme eso en mi modelo?

Por que no usas cadenas? Con %w() te quedaria hasta mas limpio.

Buenas,
para evitarte la conversión cada vez que cargues un modelo yo haría lo
que
te han sugerido, guardarlo como un string o un entero. En este caso para
hacerlo un poco más expresivo, utilizaría constantes y las sacaría fuera
del
array a la hora de acceder a ellas. Piensa que ahora te puedes acordar
en
qué posición está cada valor, pero espérate dentro de unos meses y verás
cómo te toca revisar el código para no equivocarte. Luego otra cosa es
que
quieras englobar todas las acciones dentro de un array para lo que sea.
Yo lo plantearía tal que así:

class MatchDetail

ACTION_ERROR = 0
ACTION_TO_CLEAR = 1
ACTION_OUT = 2

ACTIONS = [ACTION_ERROR, ACTION_TO_CLEAR, ACTION_OUT, …]
end

MatchDetail.new(
:player => attack[play],
:club => turn,
:action => MatchDetail::ACTION_PLAY,
:minute => last_minute,
)

Si quisieras utilizar los valores de la acción para una posible
traducción
con I18n, podrías guardarlos como cadenas tranquilamente para pasar su
valor
los helpers:

modelo

class MatchDetail
ACTION_ERROR = “actions.error”
ACTION_TO_CLEAR = “actions.to_clear”

end

vista

  • una acción en concreto:
    <%= t(:“#{MatchDetail::ACTION_ERROR}”) %>

  • la acción del modelo
    <%= t(:“#{@match_detail.action}”) %>

fichero con las traducciones es.yml

es:
action:
error: “texto para la acción de error”

Para acabar un detalle más: en ruby, cuando el último parámetro de un
método
es un hash, no hace falta que le pases las llaves si no si quieres :slight_smile:

Saludos

2009/6/17 Carlos Belizón [email protected]

Borja Martín wrote:

Buenas,

Para acabar un detalle más: en ruby, cuando el último parámetro de un
método
es un hash, no hace falta que le pases las llaves si no si quieres :slight_smile:

Saludos

2009/6/17 Carlos Belizón [email protected]

Hey, muchas gracias, me has dado una grandísima idea :).