Ayer le di una vuelta a las rails guides para refrescar la memoria acerca de las relaciones polimórficas y siguiendo un par de enlaces llegué a la guía sobre migrations. Y encontré que hay una helper para crear campos con foreign keys.
Los ejemplos de la guía son estupendos:
create_table :products do |t|
...
t.references :category
...
end
creará una tabla products con un campo category_id para hacer referencia a una tabla categories.
Para reforzar la clave extranjera con un índice apropiado es necesario utilizar un plugin como foreign key migrations.
Por otra parte, también podemos utilizar la helper references para crear campos para una relación polimórfica:
create_table :addresses do |t|
...
t.references :addressable, :polymorphic => true
...
end
creará una tabla products con los campos addresable_type y addresable_id para que funcione una relación como
class Address < ActiveRecord::Base
belongs_to :addressable, :polymorphic => true
end
Más información, aquí y aquí.
¡Salud y rocanrol!
Darkness
Imprisoning me
All that I see
Absolute horror
I cannot live
I cannot die
Trapped in myself
Body my holding cell
Landmine
Has taken my sight
Taken my speech
Taken my hearing
Taken my arms
Taken my legs
Taken my soul
Left me with life in hell
miércoles 13 de enero de 2010
jueves 10 de diciembre de 2009
No hablo de la Conferencial Rails 09 porque no estuve
Por motivos personales, este año me he perdido más de la mitad de los contenidos de la Conferencia Rails. Como casi todos los años el balance cosas positivas vs cosas negativas es bastante favorable.
De lo que vi, lo que más me gustó fueron las charlas pseudofilosóficas de Javi Ramírez, Sergio Gil y Aitor Garcia Rey porque, a pesar de que no estoy del todo de acuerdo con ellos, sí que creo que reflexionamos poco acerca de lo que hacemos día a día, acerca de todos los errores que hemos cometido en nuestra actividad y acerca de cómo podemos enforcar nuestra actividad de modo que nos haga sentir bien con nosotros mismos. Pero bastante contaron ellos como para ponerme aquí a disertar sobre el bien y el mal.
Lo peor, la charla de apertura y la de cierre del viernes. No se puede recibir a la masa con una charla que verse sobre soy guay y estoy escribiendo un libro guay después de que esa masa haya salido la noche anterior a tomar el fresco. De hecho, no se pude recibir a la masa con una charla así nunca, por el amor de dios. De la misma forma que no puede cerrar la conferencia un señor que twittea que se está durmiendo en la conferencia y que sale a dar la charla más soporífera que recuerdo en años. ¿He dicho charla? Me he confundido; he querido decir lectura, porque leyó más de la mitad de lo que dijo. Y así pasó, que más de uno y más de dos se echaron en brazos de Morfeo.
Eso sí, como siempre, la organización se merece todos mis elogios. Y lo del tío del jamón, un puntazo.
¡Salud y rocanrol!
Brothers the battle is raging, choose your side.
Sing with us the Battle Hymns, Into Glory Ride.
Hail to England. The Sign of the Hammer's our guide.
Forever we're Fighting the World, side by side.
On a crusade the world we bring
Four Kings of Metal, Four Metal Kings.
Death to the false ones, dance on a string
'Til the blood on your sword is the blood of a king.
'Til the blood on your hand is the blood of a king.
De lo que vi, lo que más me gustó fueron las charlas pseudofilosóficas de Javi Ramírez, Sergio Gil y Aitor Garcia Rey porque, a pesar de que no estoy del todo de acuerdo con ellos, sí que creo que reflexionamos poco acerca de lo que hacemos día a día, acerca de todos los errores que hemos cometido en nuestra actividad y acerca de cómo podemos enforcar nuestra actividad de modo que nos haga sentir bien con nosotros mismos. Pero bastante contaron ellos como para ponerme aquí a disertar sobre el bien y el mal.
Lo peor, la charla de apertura y la de cierre del viernes. No se puede recibir a la masa con una charla que verse sobre soy guay y estoy escribiendo un libro guay después de que esa masa haya salido la noche anterior a tomar el fresco. De hecho, no se pude recibir a la masa con una charla así nunca, por el amor de dios. De la misma forma que no puede cerrar la conferencia un señor que twittea que se está durmiendo en la conferencia y que sale a dar la charla más soporífera que recuerdo en años. ¿He dicho charla? Me he confundido; he querido decir lectura, porque leyó más de la mitad de lo que dijo. Y así pasó, que más de uno y más de dos se echaron en brazos de Morfeo.
Eso sí, como siempre, la organización se merece todos mis elogios. Y lo del tío del jamón, un puntazo.
¡Salud y rocanrol!
Brothers the battle is raging, choose your side.
Sing with us the Battle Hymns, Into Glory Ride.
Hail to England. The Sign of the Hammer's our guide.
Forever we're Fighting the World, side by side.
On a crusade the world we bring
Four Kings of Metal, Four Metal Kings.
Death to the false ones, dance on a string
'Til the blood on your sword is the blood of a king.
'Til the blood on your hand is the blood of a king.
Etiquetas:
conferencia rails madrid,
rails,
ruby,
rubyonrails
martes 1 de diciembre de 2009
Templates en Windows
Hello!
Acabo de crear un proyecto basado en un template de rails, como siempre, en entorno windows. La sitaxis es la conocida
rails nombre_de_proyecto --template=ruta_del_template
La ruta puede ser un path físico en la máquina o una url. He tenido que hacer un par de apaños muy fáciles sobre el template original para que todo funcione debidos, en su mayoría, a que ruby no es capaz de ejecutar archivos .bat si no le damos explícitamente la extensión:
El resto ha funcionado a la perfección. Ha costado más identificar el mensaje de error que otra cosa. Por cierto es éste:
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/core_ext/kernel/agnostics.rb:7:in ': Exec format error - rake db:create:all'
Me volverá a ocurrir esto mismo otra vez y me olvidaré. Lo saben aquí y en la República Democrática del Congo. ¡Salud y rocanrol!
Way down in Louisiana amongst the tall grown sugar canes
lived a simple man and a domineerin' hen and a rose of a different name.
The first time I fell lightly I was standing in the drizzlin' rain
with a trembling hand and a bottle of gin and a rose of a different name.
The devil made me do it the first time the second time I done it on my own.
Lord put a handle on a simple handed man and help me leave that black rose alone.
When the devil made that woman Lord she threw the pattern away.
She was built for speed with the tools you need to make a new fool every day.
Way down deep and dirty on the darker side of shame,
you caught a cane cuttin' man with a bottle of gin with a rose of a different name
The devil made me do it the first time the second time I done it on my own.
Lord put a handle on a simple handed man and help me leave that black rose alone.
Acabo de crear un proyecto basado en un template de rails, como siempre, en entorno windows. La sitaxis es la conocida
rails nombre_de_proyecto --template=ruta_del_template
La ruta puede ser un path físico en la máquina o una url. He tenido que hacer un par de apaños muy fáciles sobre el template original para que todo funcione debidos, en su mayoría, a que ruby no es capaz de ejecutar archivos .bat si no le damos explícitamente la extensión:
- Las llamadas a run 'gem ...' las he cambiado por run 'gem.bat ...'.
- Las llamadas a rake las he cambiado por run 'rake.bat ...'.
- He eliminado cualquier referencia a sudo en todas las llamadas a sistema.
El resto ha funcionado a la perfección. Ha costado más identificar el mensaje de error que otra cosa. Por cierto es éste:
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/core_ext/kernel/agnostics.rb:7:in ': Exec format error - rake db:create:all'
Me volverá a ocurrir esto mismo otra vez y me olvidaré. Lo saben aquí y en la República Democrática del Congo. ¡Salud y rocanrol!
Way down in Louisiana amongst the tall grown sugar canes
lived a simple man and a domineerin' hen and a rose of a different name.
The first time I fell lightly I was standing in the drizzlin' rain
with a trembling hand and a bottle of gin and a rose of a different name.
The devil made me do it the first time the second time I done it on my own.
Lord put a handle on a simple handed man and help me leave that black rose alone.
When the devil made that woman Lord she threw the pattern away.
She was built for speed with the tools you need to make a new fool every day.
Way down deep and dirty on the darker side of shame,
you caught a cane cuttin' man with a bottle of gin with a rose of a different name
The devil made me do it the first time the second time I done it on my own.
Lord put a handle on a simple handed man and help me leave that black rose alone.
Etiquetas:
aplicación,
console,
gems,
plugins,
rails,
ruby,
rubyonrails,
util,
windows
sábado 21 de noviembre de 2009
Conferencia Rails 2009
El próximo miércoles 25 comienza la Conferencia Rails 2009. Este año me han colocado las cosas como a mí me gustan, casi sin colisiones entre temas interesantes. Además hay mucha presencia internacional, tanto en ponentes como en asistentes: Obie Fernández, Yehuda Katz, David Black, Scott Chacon... Aquí podéis ver la nota de prensa oficial.
En CameraWC he subido un vídeo para saludar tanto a los asistentes como a los no asistentes. Y en unvlog hay muchos más.
Bueno, tengo fundadas esperanzas en que este año todo va a ser mucho mejor que el pasado. La semana que viene lo comentamos. Salud y rocanrol!
I was getting kind of tired of her endless chatter.
Nothing I could say ever seemed to matter.
So I took a little drive just to clear my head,
and I saw a flashing neon, up ahead.
It looked like a place to find some satisfaction
with a little less talk and a lot more action.
I paid the man at the door and pushed my way to the bar.
Shouted for a drink over a screaming guitar.
A drunk on a stool tried to mess with my head
but I didn't even listen to a word he said.
I knew somewhere amid all this distraction.
Was a little less talk and a lot more action
En CameraWC he subido un vídeo para saludar tanto a los asistentes como a los no asistentes. Y en unvlog hay muchos más.
Bueno, tengo fundadas esperanzas en que este año todo va a ser mucho mejor que el pasado. La semana que viene lo comentamos. Salud y rocanrol!
I was getting kind of tired of her endless chatter.
Nothing I could say ever seemed to matter.
So I took a little drive just to clear my head,
and I saw a flashing neon, up ahead.
It looked like a place to find some satisfaction
with a little less talk and a lot more action.
I paid the man at the door and pushed my way to the bar.
Shouted for a drink over a screaming guitar.
A drunk on a stool tried to mess with my head
but I didn't even listen to a word he said.
I knew somewhere amid all this distraction.
Was a little less talk and a lot more action
Etiquetas:
rails conferencia rails madrid,
ruby,
rubyonrails
jueves 12 de noviembre de 2009
Generando un avatar
Inventemos una palabra en castellano para traducir avatar. Podemos castellanizarla directamente, avatario o ávatar, porque parece que no podemos traducirla y, algo como, imagencilla, imagen de usuario o imagen en twitter, no me convence del todo.
Y dicha la tontería, vamos a lío. Supongamos que tenemos una imagen cuya ruta es C:/Users/danimata/full_body.jpg. Vamos a recortar un trozo de la imagen cuyo vértice superior izquierdo es (x1, y1) e inferior derecho (x2, y2). Además, para que el recorte nos quede bien en nuestra página de perfil de usuario, lo vamos a escalar para que tenga altura h y anchura w. Finalmente, lo guardaremos como C:/Users/danimata/avatar.jpg
Si utilizamos RMagick haremos lo siguiente:
require 'RMagick'
img = Magick::Image.read("C:/Users/danimata/full_body.jpg").first
tmp_avatar = img.crop(x1, y1, (x2 - x1 + 1), (y2 - y1 + 1))
avatar = tmp_avatar.resize(w, h)
temp = Tempfile.new("C:/Users/danimata/avatar.jpg") avatar.write "png:" + temp.path
Sin embargo, si utilizamos image_science haremos lo siguiente:
require 'image_science'
temp = Tempfile.new("C:/Users/danimata/avatar.jpg")
ImageScience.with_image "C:/Users/danimata/full_body.jpg" do |image|
image.with_crop x1, y1, x2, y2 do |cropped|
cropped.resize w, h do |avatar|
avatar.save temp.path
end
end
end
Y listo. Como siempre, salud y rocanrol!
La noche se está cayendo
y con ella cae el tiempo.
El día no sirvió de nada,
tarde de nubes sin agua.
Hoy el cielo es de cemento,
parece que dios está muerto.
Golpean la puerta de casa,
mensajeros de desgracia...
¡malas noticias!
Y dicha la tontería, vamos a lío. Supongamos que tenemos una imagen cuya ruta es C:/Users/danimata/full_body.jpg. Vamos a recortar un trozo de la imagen cuyo vértice superior izquierdo es (x1, y1) e inferior derecho (x2, y2). Además, para que el recorte nos quede bien en nuestra página de perfil de usuario, lo vamos a escalar para que tenga altura h y anchura w. Finalmente, lo guardaremos como C:/Users/danimata/avatar.jpg
Si utilizamos RMagick haremos lo siguiente:
require 'RMagick'
img = Magick::Image.read("C:/Users/danimata/full_body.jpg").first
tmp_avatar = img.crop(x1, y1, (x2 - x1 + 1), (y2 - y1 + 1))
avatar = tmp_avatar.resize(w, h)
temp = Tempfile.new("C:/Users/danimata/avatar.jpg") avatar.write "png:" + temp.path
Sin embargo, si utilizamos image_science haremos lo siguiente:
require 'image_science'
temp = Tempfile.new("C:/Users/danimata/avatar.jpg")
ImageScience.with_image "C:/Users/danimata/full_body.jpg" do |image|
image.with_crop x1, y1, x2, y2 do |cropped|
cropped.resize w, h do |avatar|
avatar.save temp.path
end
end
end
Y listo. Como siempre, salud y rocanrol!
La noche se está cayendo
y con ella cae el tiempo.
El día no sirvió de nada,
tarde de nubes sin agua.
Hoy el cielo es de cemento,
parece que dios está muerto.
Golpean la puerta de casa,
mensajeros de desgracia...
¡malas noticias!
Etiquetas:
image_science,
rails,
rmagick,
ruby,
rubyonrails
miércoles 28 de octubre de 2009
Presentación sobre OpenID y OAuth
He creado una presentación para contar a unos amigos lo más básico sobre OpenID y OAuth.
Salud y rocanrol
¿Quién tiró la piedra? ¿Quién escondió la mano?
¡Quién le puso el pie al gordo del "Gran Hermano"?
Quien sabe lo que sabe, sabe que no sabe nada.
El que nada no se ahoga o le dan por la almorrana
¡O le dan por la almorrana!
Y si tiene almorranas es que sufre en silencio.
El silencio pa' los muertos, yo me quedo con un tercio.
Tres tercios son un litro o cinco botellines.
Con cinco botellines hay que echarse un cigarrito.
¡Hay que echarse un cigarrito!
Salud y rocanrol
¿Quién tiró la piedra? ¿Quién escondió la mano?
¡Quién le puso el pie al gordo del "Gran Hermano"?
Quien sabe lo que sabe, sabe que no sabe nada.
El que nada no se ahoga o le dan por la almorrana
¡O le dan por la almorrana!
Y si tiene almorranas es que sufre en silencio.
El silencio pa' los muertos, yo me quedo con un tercio.
Tres tercios son un litro o cinco botellines.
Con cinco botellines hay que echarse un cigarrito.
¡Hay que echarse un cigarrito!
Etiquetas:
oauth,
openid,
rails,
ruby,
rubyonrails
domingo 25 de octubre de 2009
La absurdez hecha duda
Hoy me ha surgido la duda de cómo hacer una validación de unicidad sobre dos atributos de un modelo. Nunca había tenido que hacer algo similar en Rails.
La mejor opción que he encontrado ha sido
validates_uniqueness_of :family_id, :scope => :user_id
Esto validará que para cada valor de user_id el valor de family_id es único. Seguro que hay una solución mejor y más estándar, pero yo no me la sé.
Weno, pues nada. Ha sido breve pero intenso. Salud y rocanrol.
We all came out to Montereax
On the Lake Geneva shoreline
To make records with a mobile
We didn't have much time
Frank Zappa and the Mothers
Were at the best place around
But some stupid with a flare gun
Burned the place to the ground
Smoke on the water, fire in the sky
Smoke on the water...
La mejor opción que he encontrado ha sido
validates_uniqueness_of :family_id, :scope => :user_id
Esto validará que para cada valor de user_id el valor de family_id es único. Seguro que hay una solución mejor y más estándar, pero yo no me la sé.
Weno, pues nada. Ha sido breve pero intenso. Salud y rocanrol.
We all came out to Montereax
On the Lake Geneva shoreline
To make records with a mobile
We didn't have much time
Frank Zappa and the Mothers
Were at the best place around
But some stupid with a flare gun
Burned the place to the ground
Smoke on the water, fire in the sky
Smoke on the water...
Etiquetas:
rails,
ruby,
rubyonrails,
util,
validations
lunes 5 de octubre de 2009
Git en Windows Vista
Por fin he puesto a funcionar un proyecto que tira de un repositorio git. Para ello he tenido que hacer tres cosas:
Un par de links interesantes por si encontráis otros problemas: un manual http://kylecordes.com/2008/04/30/git-windows-go/ y una lista de posibles errores con su solución http://github.com/guides/addressing-authentication-problems-with-ssh
Salud y rocanrol!
She was a fast machine
She kept her motor clean
She was the best damn woman that I'd ever seen
She had the sightless eyes
Telling me no lies
Knocking me out with those American thighs
Taking more than her share
Had me fighting for air
She told me to come but I was already there
Cause the walls started shaking
The earth was quaking
My mind was aching
And we were making it and you
Shook me all night long
Yeah you
Shook me all night long
- instalar git para windows desde aquí
- confgurar la variable de entorno GIT_SSH para que apunte al ejecutable ssh que viene con el instalador de git, típicamente en C:\Program Files\Git\bin\ssh.exe
- clonar el repositorio y empezar a trabajar
Un par de links interesantes por si encontráis otros problemas: un manual http://kylecordes.com/2008/04/30/git-windows-go/ y una lista de posibles errores con su solución http://github.com/guides/addressing-authentication-problems-with-ssh
Salud y rocanrol!
She was a fast machine
She kept her motor clean
She was the best damn woman that I'd ever seen
She had the sightless eyes
Telling me no lies
Knocking me out with those American thighs
Taking more than her share
Had me fighting for air
She told me to come but I was already there
Cause the walls started shaking
The earth was quaking
My mind was aching
And we were making it and you
Shook me all night long
Yeah you
Shook me all night long
martes 29 de septiembre de 2009
FasterCSV y Rails 2.3
Pues parece FasterCSV y Rails 2.3 no terminan de llevarse bien. De hecho, en las aplicaciones rails que he migrado a la versión 2.3.2, cualquier exportación de datos a formato CSV ha dejado de funcionar. Lo extraño es que no falla nada salvo que los archivos resultantes están vacíos.
Menos mal que San Google siempre está ahí, cuando se le necesita. Buscando buscando llego aquí donde explican que en Rails 2.3 a ActionController::Response le han quitado el método << con lo que las concatenaciones típicas en la generación de archivos CSV no funcionan. En el link se ofrece una solucioncilla on the fly que funciona estupendamente para código viejuno.
En fin, as usual, salud y rocanrol
Piensas otra vez que ahora es tu momento,
aunque al parecer todo vuelve a cambiar.
Es difícil ser otra vez tú mismo,
y no ver a tiempo que estás acabado.
¿Quién te convenció de cantar así?
¿Quién te prometió la inmortalidad?
Tratan de volver los desertores del rock.
Tratan de volver los desertores del rock.
¡Pero es tarde ya!.
Menos mal que San Google siempre está ahí, cuando se le necesita. Buscando buscando llego aquí donde explican que en Rails 2.3 a ActionController::Response le han quitado el método << con lo que las concatenaciones típicas en la generación de archivos CSV no funcionan. En el link se ofrece una solucioncilla on the fly que funciona estupendamente para código viejuno.
En fin, as usual, salud y rocanrol
Piensas otra vez que ahora es tu momento,
aunque al parecer todo vuelve a cambiar.
Es difícil ser otra vez tú mismo,
y no ver a tiempo que estás acabado.
¿Quién te convenció de cantar así?
¿Quién te prometió la inmortalidad?
Tratan de volver los desertores del rock.
Tratan de volver los desertores del rock.
¡Pero es tarde ya!.
Etiquetas:
plugins,
rails,
ruby,
rubyonrails
miércoles 9 de septiembre de 2009
Nota mental
Hay cosas que por más que las leas, las veas y las intentes retener, son imposibles de memorizar. Hay otras, sin embargo, que se quedan ahí contigo para el resto de tu vida, y que no sirven para nada. Como la típica cancioncilla que oyes a alguien y no se te va de la cabeza en todo el día. Probemos con 'dragones y mazmorras, un mundo infernal, se esconde entre las sombras, la fuerza del mal'.
En fin, no sé cuantas veces he buscado cómo se llama la variable local que contiene el número de iteración que pinta en cada momento. Por lógica, se llama contador o counter, pero en estos casos la lógica no aparece por ningún lado. Y para que cada partial tenga la suya, por delante se pone el nombre del archivo. Es decir, si ejecutamos
<%= render :partial => 'line', :collection => @lines %>
cada ejecución del partial _line.html.rb contará con la variable local line_counter cuyo valor irá creciendo en cada ejecución desde 0 hasta el número de items contenidos en @lines menos 1.
Para más información, pregunten por el señor api.
Me juego una caña a que se me olvida que he escrito este post. Salud y rocanrol
Sólo quiero ser más rápido que ellos
y echar todo a perder un día tras otro
y un buen rato después saber llegar a casa
antes de que el sol, me diga que es de día
En fin, no sé cuantas veces he buscado cómo se llama la variable local que contiene el número de iteración que pinta en cada momento. Por lógica, se llama contador o counter, pero en estos casos la lógica no aparece por ningún lado. Y para que cada partial tenga la suya, por delante se pone el nombre del archivo. Es decir, si ejecutamos
<%= render :partial => 'line', :collection => @lines %>
cada ejecución del partial _line.html.rb contará con la variable local line_counter cuyo valor irá creciendo en cada ejecución desde 0 hasta el número de items contenidos en @lines menos 1.
Para más información, pregunten por el señor api.
Me juego una caña a que se me olvida que he escrito este post. Salud y rocanrol
Sólo quiero ser más rápido que ellos
y echar todo a perder un día tras otro
y un buen rato después saber llegar a casa
antes de que el sol, me diga que es de día
Etiquetas:
rails,
ruby,
rubyonrails,
util
Suscribirse a:
Entradas (Atom)