Имам интересен проблем с Active Record и не съм съвсем сигурен кое е най-чистото решение. Наследената база данни, с която се интегрирам, има странна гънка в схемата си, където една логическа таблица е „разделена“ на няколко физически таблици. Всяка таблица има еднаква структура, но съдържа данни за различни елементи.
Не съм добър в обясняването на това ясно (както можете да разберете!). Нека се опитам да обясня с конкретен пример. Да кажем, че имаме кола, която има едно или повече колела. Обикновено бихме представили това с маса с кола и маса с колела така:
CREATE TABLE cars (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255),
;etc
)
CREATE TABLE wheels (
`id` int(11) NOT NULL auto_increment,
`car_id` int(11) NOT NULL,
`color` varchar(255),
;etc
)
Дотук добре. Но със стратегията за „разделяне“, която е в моята наследена база данни, ще изглежда по-скоро като:
CREATE TABLE cars (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255),
;etc
)
CREATE TABLE car_to_wheel_table_map (
`car_id` int(11) NOT NULL,
`wheel_table` varchar(255)
)
CREATE TABLE wheels_for_fords (
`id` int(11) NOT NULL auto_increment,
`car_id` int(11) NOT NULL,
`color` varchar(255)
)
CREATE TABLE wheels_for_buicks (
`id` int(11) NOT NULL auto_increment,
`car_id` int(11) NOT NULL,
`color` varchar(255)
)
CREATE TABLE wheels_for_toyotas (
`id` int(11) NOT NULL auto_increment,
`car_id` int(11) NOT NULL,
`color` varchar(255)
)
И така, тук имаме набор от таблици wheels_for_x и таблица car_to_wheel_table_map, която съдържа преобразуване от car_id към конкретния wheels_for_x, който съдържа колелата за конкретна кола. Ако искам да намеря комплекта колела за кола, първо трябва да открия коя таблица с колела да използвам чрез таблицата car_to_wheel_table_map и след това да потърся записи в таблицата с колела, посочени в car_to_wheel_table_map.
Първо, може ли някой да ме просветли дали има стандартно име за тази техника?
Второ, някой има ли насоки как мога да накарам това да работи в Active Record по хубав чист начин. Начинът, по който го виждам, мога или да имам модел на колело, където името на таблицата може да бъде дефинирано за екземпляр, или мога динамично да създавам класове на модела по време на изпълнение с правилното име на таблицата, както е посочено в таблицата за съпоставяне.
РЕДАКТИРАНЕ: Имайте предвид, че промяната на схемата, за да бъде по-близо до това, което AR иска, не е опция. Различни наследени кодови бази разчитат на тази схема и реалистично не могат да бъдат модифицирани.