.: claves compuestas en tablas ?!?!


#1

Estimados: Como recien me estoy iniciando en el mundo rails vi en este
artículo
http://www.oracle.com/technology/pub/articles/haefel-oracle-ruby.html

que comentan que rails no soporta tablas con claves compuestas!!! Como
hago para el caso de tener una relacion N:N (muchos a muchos) cuya clave
es la primary key de cada una de las tablas que componen la relación???
Como resolvieron esto para mantener la integridad y las referencias
(cascade, set null, etc)?
Saludos y muchas gracias


#2

que comentan que rails no soporta tablas con claves compuestas!!!
ActiveRecord no soporta tablas con claves compuestas, aunque si tuvieses
alguna por algún tema de legacy puedes utilizar sql directamente. De
hecho, para las consultas puedes seguir usando AR siempre y cuando
tengas la precaución de no usar el método find directamente sino el
método “find_by_clave1_and_clave2”. Para los inserts y updates tendrías
que tirar de algún plugin o directamente de sql, con lo que te pierdes
los callbacks que proporciona rails.

Como hago para el caso de tener una relacion N:N (muchos a muchos) cuya clave
es la primary key de cada una de las tablas que componen la relación???

tienes un par de formas… una es una relación has_and_belongs_to_many
en la que se guarda exactamente lo que tú comentas, una FK por cada
tabla relacionada. Como en este caso no necesitas acceder nunca
directamente a la tabla intermedia, te da básicamente igual que tenga o
no una PK propia. La otra es un has_many_through, en el que sigues
teniendo una FK por cada tabla relacionada y además tiene un campo que
le hace de PK. Estas relaciones se usan cuando la relación en sí misma
tiene campos asociados y vas a tener que acceder a ella.

Como resolvieron esto para mantener la integridad y las referencias (cascade, set null, etc)?
las referencias van a nivel de FK, así que no tienes problemas en
mantener la integridad.

saludos,

j

Estamos de estreno… si necesitas llevar el control de tus gastos
visita http://www.gastosgem.com !!Es gratis!!