2011-07-20 36 views
1

我正在构建一个RoR多租户应用程序。所以应用程序数据库可以托管在不同的地方,可以被分割或重新合并。这就是为什么我需要几个主键:一个经典的自动递增的ID和另一个是我的主要模型的外键(这不能分解)。Ruby on Rails迁移,两个主键但只有一个自动递增

我想要做这样的事情:

create_table :table_name do |t| 
    t.primary_key :id 
    t.primary_key :second_id, :auto_increment => false 
    # ... 
    t.timestamps 
end 

但我没有找到正确的语法,任何想法?

编辑:我想做一个迁移!

回答

0

经过大量的研究和测试,我认为用传统的移植方法是不可能的。但我发现解决方案继续使用迁移来管理我的数据库。使用execute命令可以包含SQL部分。

所以,我的创作看起来像:

def self.up 

    execute "CREATE TABLE `table_name` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `org_id` int(11) NOT NULL, 
    `created_at` datetime DEFAULT NULL, 
    `updated_at` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`, `org_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=151 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;" 

end 

def self.down 
    drop_table :table_name 
end 

这不是真的很漂亮,但它做的工作。

+0

然后你失去了使用rails''find'方法获取id的能力 – Anwar

+0

@Anwar为什么?它只是创建一个具有自动递增ID的经典MySQL表。 –

+0

我今天测试过了。双圆柱表丢失轨道''find_by_id'方法,并且'find'不能按预期工作 – Anwar

2

表中不能有两个主键。

您可以有两个候选键(称为在MySQL中的唯一索引/其他DB的约束密钥)

您可以由两个领域,如果你想复合主键。我认为这是mySQL中的语法primary key (fieldA,fieldB)

但是,当其中一个字段是自动增量时,执行组合键是没有意义的。由于自动增量alreayd本身具有唯一性,除id以外的每个属性都会对其具有功能依赖性。在主键中包含second_id不会对您有任何帮助。

+0

当然,我想说一个复合主键。问题是一样的。 **我知道如何在MySQL中执行此操作,但不能使用RoR迁移。** –

+0

哦。我看到这可能会帮助http://compositekeys.rubyforge.org/ –

+0

我已经看到了这个宝石,但如果可能的话,我宁愿自己管理这件事,因为宝石做我需要的很多东西。 –

0

CREATE TABLE testtst

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

second_id INT NOT NULL,

timest DATE NOT NULL,

UNIQUE( second_id

)ENGINE = MYISAM ;

是这样吗?

+0

不正确,因为second_id也是一个外键,不是唯一的。 **我想通过RoR迁移来做到这一点。** –