que se enfrentaron a un problema similar al migrar un sitio a rieles. tenía una tabla que almacena da texto ta para cada idioma de mi sitio está disponible en así que tenía algo como esto:
CREATE TABLE Project_Lang(
project_id INT NOT NULL,
language_id INT NOT NULL,
title VARCHAR(80),
description TEXT,
PRIMARY KEY pk_Project_Lang(project_id, language_id),
FOREIGN KEY fk_Project_Lang_Project(project_id)
REFERENCES Project(project_id)
ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY fk_Project_Lang_Language(language_id)
REFERENCES Language(language_id)
ON DELETE RESTRICT ON UPDATE CASCADE
)ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 DEFAULT COLLATE = utf8_spanish_ci;
Pero ya que los carriles no maneja claves primarias compuestas fuera de la caja que se vio obligado a cambiar la estructura de la mesa, así que tenía que es clave primaria propia:
CREATE TABLE Project_Lang(
project_lang_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
project_id INT NOT NULL,
language_id INT NOT NULL,
title VARCHAR(80),
description TEXT,
UNIQUE INDEX(project_id, language_id),
FOREIGN KEY fk_Project_Lang_Project(project_id)
REFERENCES Project(project_id)
ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY fk_Project_Lang_Language(language_id)
REFERENCES Language(language_id)
ON DELETE RESTRICT ON UPDATE CASCADE
)ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 DEFAULT COLLATE = utf8_spanish_ci;
también he creado un índice único para las columnas que anteriormente hicieron la clave principal compuesta de manera que se introduce ningún registro duplicado. Luego, en mi modelo de Rails, pude simplemente:
self.primary_key = "project_lang_id"
Y eso funcionó. No es lo que quería, pero es mejor que luchar contra el marco.
si la palabra pertenece a un idioma ¿por qué necesita almacenar lang con ella? Puede simplemente delegarlo en el Modelo de Idioma. Dicho esto, estarás luchando contra los rieles. Solo usaría la clave ID como la clave principal. delegar: lang a Language y no preocuparse por la clave compuesta – Doon
de hecho, gracias. : lang proviene de ald scaffilding. Necesito eliminarlo de aquí ya que uso el modelo de Idioma. Thx –