martes, 18 de enero de 2011

Soy un incompetente

Para variar, me pasan cosas. Cosas rarunas. Os cuento.

Trabajando con Ruby 1.8.7 y Rails 2.3.8 y un código como este presente en un observer...

game = Game.find(some_id)
tmp_letters = cositas_varias(game.letters)
game.letters = String.new(tmp_letters)
game.save


me encuento con que no se genera un UPDATE sobre el registro correspondiente de la tabla GAMES. De hecho, ese código está tan adornado con el único objetivo de entontrar la manera de hacer que ese UPDATE se ejecute. Y habiendo probado de todo, el UPDATE sobre la tabla sólo se producía si a game.letters le asignaba un string constante...

game.letters = 'quecojonespasa'

Lo más sorprendente (o no) es que la asignación

game.letters = String.new(tmp_letters)

produce que game.changed? sea false.

He leído aquí que algunos operadores que se ejecutan sobre atributos de tipo String hacen que efectivamente changed? sea false y que por tanto no se ejecute UPDATE alguno. Y efectivamente, avisando al modelo de que el atributo ha cambiado con

game.letters_will_change!

hace que changed? sea true y el UPDATE se ejecute.

Y esto me hace retrotraerme a cuando en C y C++ te tenías que preocupar de pasar una variable por valor o por referencia y de si se genera copia o no y tal y pascual... Y como no recuerdo que nada así me haya pasado anteriormente en ruby on rails... o he tenido mucha 'suerte', que me extraña, o en esta versión de Ruby y Rails algo cambia o soy un incompetente. Que va a ser eso.

¡Salud y rocanrol!

The old man was covered with tattoos and scars
He got some in prison and others in bars
The rest he got workin' on old junk cars in the daytime
They looked like tombstones in our yard
And I never seen him when he wasn't tired and mean
He sold used parts to make ends meet
Covered with grease from his head to his feet
Cussin' the sweat and the Texas heat and mosquiters
And the neighbors said we lived like hicks
But they brung their cars for pa to fix anyhow
He was veteran-proud tried and true
He'd fought till his heart was black and blue
Didn't know how he'd made it through the hard times
He bought our house on the GI Bill
But it wasn't worth all he had to kill to get it
He drank pearl in a can and Jack Daniels black
Chewed tobacco from a mail pouch sack
Had an old dog that was trained to attack sometimes
He'd get drunk and mean as a rattlesnake
And there wasn't too much that he would take from a stranger
There were thirteen kids and a bunch of dogs
A house full of chickens and a yard full of hogs
I spent the summertime cuttin' up logs for the winter
Tryin' like the devil to find the Lord
Workin' like a slave for my room and board
Coal-burin' stove no natural gas if that ain't country I'll kiss your ass
If that ain't country it'll hairlip the pope
If that ain't country it's a damn good joke
I've seen the Grand Ole Opry and I've met Johnny Cash
If that ain't country I'll kiss your ass

2 comentarios:

Anónimo dijo...

Animos viejo eres todo un groso (un capo, un master) y estas avanzado seguro que encontraras la repuesta (veo que no se actualiza la propiedad del obejto Array game, raro no? bueno para tomar nota) . Por otra parte digo que un incompetente sería algo como yo que no sabe Inglés y me cuesta un lot para entender los tutoriales y libros de Rails (pero de tanto leer en inglés voy entendiendo cada vez más).
Veo que usas 1.3.7 y 2.3.8. pregunta Lo haces con GNU/Linux o con Windows?. Yo estoy viendo de migrar a Linux Fedora o Debian ya vere que hago, porque por lo que vi es más rápido Rails en Linux que en Windows. Te cuento que estuve también jugando con el Active Record haciendo tutoriales y viendo las mejoras de Rails 3.0 (varias) y Renegando con Git y GitHub, Heroku todo desde Windows, además de ver los links que me recomiendas y me pone loco Git (shit) ya que no me deja subir mi proyecto Rails. En fin Dani ya me comunicare cuando haga andar Git y Heroku o algo...

danimataonrails dijo...

Uso Windows. En general es bastante más lento que en Ubuntu o en Debian y además hay algunas gemas que no funcionan. Y las que exigen recompilar dan problemillas que se pueden resolver. Utilizo PIK para poder tener varias versiones de rails instaladas y gestionarlas fácilmente, y DevKit como apoyo.