Migration y Foreing keys


#1

Hola a todos, me presento pues soy nuevo en la comunidad, mi nombre es
Ricardo y hasta ahora me he centrado en lenguajes de script
principalmente PHP y en especial symfony como framework, ahora me han
surgido ganas de adquirir nuevos puntos de vista con los que poder
“decorar” mis futuras aplicaciones, ROR me ha parecido muy interesante
junto con Django debido a sus fuerte OOP y las buenas librerias que
posee tanto ruby con python.

Trasteando con ROR para evaluar sus escalabilidad y su flexibilidad he
topado con el concepto de Migracion, que por cierto me ha parecido
magnifico, pero me ha surgido una duda, Al generar mi esquema de DB
desde “migrations”, he notado que las relaciones entre tablas se
realizan en el Modelo, a mi personalmente me gustaria generar las
foreing keys dentro de la base de datos para asi usar la integridad
refencial asi como los indices primarios entre tablas , vitales en
grandes volumenes de datos.

No se si estoy equivocado, pues soy nuevo en ROR, segun la documentacion
las foreing key se construyen como table_id pero al insertar datos
directamente en la BD no tiene encuenta la integridad referencial, segun
parece ya se encarga ROR de ello.

¿Alguien sabe como hacer que las relaciones sean a nivel de base de
datos, en el mas puro estilo DBA?

Un saludo a todos y gracias


#2

hola,

¿Alguien sabe como hacer que las relaciones sean a nivel de base de
datos, en el mas puro estilo DBA?

una forma sencilla es usar el plugin de foreign key migrations de
http://www.redhillonrails.org/

a partir de ahí, cada vez que en una migration tengas un campo que se
llame LOQUESEA_id, el plugin va a interpretar que quieres poner una FK
referenciando a la tabla LOQUESEA.

Si por cualquier motivo no es así (pasa por ejemplo con campos parent_id
que hacen referencia a la misma tabla) puedes meterle la claúsula
:references=>latabladeverdad o :references=>nil para que no cree FK

En cuanto hagas eso, tendrás que tener especial cuidado en el orden en
el que creas las tablas, ya que al establecerse FKs te va a dar errores
lógicamente si creas una tabla hija antes que una padre (y lo mismo para
el procedimiento down)

Más detalles directamente en la página del plugin :wink:

saludos,

javier ramírez


#3

On Jul 6, 2007, at 12:35 PM, ricardo - detectomania.com wrote:

No se si estoy equivocado, pues soy nuevo en ROR, segun la
documentacion
las foreing key se construyen como table_id pero al insertar datos
directamente en la BD no tiene encuenta la integridad referencial,
segun
parece ya se encarga ROR de ello.

Es correcto, Rails crea primary keys pero no foreign keys. Las
relaciones entre tablas no estan en el esquema, se definen solo a
nivel de modelos para poder recorrer y manipular relaciones.

Existe un plugin que crea foreign keys de manera transaparente si tus
migrations siguen convenciones normales, y permite configurar cada
una con :references si se necesita puntualmente, es este:

http://www.redhillonrails.org/#foreign_key_migrations

Nosotros (ASPgems) lo usamos en todas las aplicaciones cuya base de
datos soporte foreign keys.

– fxn


#4

Muchas gracias por la magnifica contestación, me habeis salvado muchas
horas de navegación, me estaba volviendo un poquillo loco pues pensaba
que estaba equivocado hacia algo mal. No entiendo por que no incluyen
esta funcionalidad en el nucleo de ROR.

Ya lo he instalado y ahora voy a ver que tal se comporta y os comentaré,
a mi principalmente me interesa echar manos de las librerias matemáticas
que tiene ruby, aunque creo que las de python son algo mejores, bueno ya
se
verá.
Muchas gracias por la contestación y espero que pronto poder ayudar en
esta creciente comunidad. y quien sabe lo mismo me animo a ir a la
conferencia de ruby que teneis pensado organizar.

Un saludo
Ricardo


#5

Hola vuelvo a sacar el hilo de la controversia, las relaciones foreign
keys.

He probado el plugin de redhill para manejar Dichas foreign desde
db:migration, pero he notado una cosa curiosa, el plugin funciona cuando
son campos de tipo “table_id”, ya que la expresión regular lo mapea a la
correspondiente tabla. Pero en cambio en tablas con campos parent_id
como las que utiliza Act_as_tree o las nested, como en mi caso el plugin
falla y no puede crear la la relación, debido a que la columna parent_id
la intenta enlazar a una tabla que no existe “parent”.

He probado el plugin ActsAsNestedSet y este si me funcionó mucho mejor.
¿Alguien ha tenido el mismo problema?.

Un saludo
Ricardo


#6

Hola,

son campos de tipo “table_id”, ya que la expresión regular lo mapea a la
correspondiente tabla. Pero en cambio en tablas con campos parent_id
como las que utiliza Act_as_tree o las nested, como en mi caso el plugin
falla y no puede crear la la relación, debido a que la columna parent_id
la intenta enlazar a una tabla que no existe “parent”.

como bien te dice la documentación del plugin
(http://www.redhillonrails.org/#foreign_key_migrations)

" If you have multiple columns referencing a table or for whatever
reason, your column name isn’t the same as the referenced table name,
you can use the :references option"

que hablando en castellano quiere decir que uses el parámetro
:references con el nombre de la columna que quieras o nil en caso de que
no quieras una clave externa.

saludos,

javier ramírez


#7

jajaj, upsss ni me habia fijado en ese detalle, muchas gracias y siento
el despiste… la verdad está ahi fuera, tan solo hay que saber buscarla .

Un saludo y gracias por la rapida respuesta.

javier ramirez
escribió:> Hola,