【发布时间】:2009-05-13 04:29:15
【问题描述】:
我有一个有趣的 Active Record 问题,但我不太确定是什么 最干净的解决方案是。我正在集成的旧数据库 在其架构中有一个奇怪的皱纹,其中一个逻辑表已经 “分区”成几个物理表。每个表都有相同的 结构,但包含有关不同项目的数据。
我不擅长清楚地解释这一点(如您所知!)。让我尝试 并用一个具体的例子来解释。假设我们有一辆汽车,它有 一个或多个轮子。通常我们会用 Car 表和 轮子表是这样的:
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,其中包含特定汽车的轮子。如果我 想为一辆车找到一套轮子我首先要找出哪个 Wheels 表通过 car_to_wheel_table_map 表使用,然后查看 在 car_to_wheel_table_map 中指定的轮表中向上记录。
首先,有人可以告诉我是否有标准名称 这种技术?
其次,是否有人对我如何使这项工作有任何指示 以干净整洁的方式进行 Active Record。我看到它的方式我可以有一个 可以为每个实例定义表名的轮模型,或者我可以 在运行时使用正确的表名动态创建模型类 在映射表中指定。
编辑:请注意,将架构更改为更接近 AR 想要的不是一种选择。各种遗留代码库都依赖此架构,实际上无法修改。
【问题讨论】:
-
如果将来有人需要玩类似的东西,请参阅此问答:stackoverflow.com/questions/52537951/…
标签: ruby-on-rails activerecord