如何在遗留项目中使用Rails ActiveRecord和Postgres不兼容?

时间:2014-02-14 11:58:39

标签: ruby-on-rails postgresql activerecord

我正在使用一个针对MySQL运行一段时间的项目。有这样的迁移:

add_index "things", ["one", "two", "three", "andevenmorelongnamedfields"]

导致名为index_things_on_one_and_two_and_three_and_andevenmorelongnamedfields的索引。对于MySQL来说这是好的,但对PostgreSQL来说太长了。

This question建议更改现有迁移。

add_index "things", ["one", "two", "three", "andevenmorelongnamedfields"], :name => "index_things_on_one_and_two_and_three_and_more"

这会在表面上解决它。

然而,代码库已经针对MySQL运行,因此改变过去的迁移将是一个坏主意。我正试图从头开始安装PostgreSQL(我认为)意味着运行所有迁移?

我可能在这里遗漏了一些东西(我对Django比较熟悉),但我认为ActiveRecord在这个特定实例中与PostgreSQL不兼容是正确的吗?

如何解决这个问题(即让它与Postgres和MySQL一起使用)而不会为其他人创建完整性问题?

1 个答案:

答案 0 :(得分:1)

一种方法是在MySQL端创建和运行新的迁移,将索引重命名为更短的内容。然后你就可以在Postgres端运行rake db:schema:load并且不应该有问题。

另请注意db/schema.rb顶部的警告:

  

请注意,此schema.rb定义是数据库架构的权威来源。如果需要在另一个系统上创建应用程序数据库,则应使用db:schema:load,而不是从头开始运行所有迁移。后者是一种有缺陷且不可持续的方法(你会积累的迁移越多,它的运行速度越慢,发生问题的可能性就越大)。

这绝对是“有缺陷且不可持续”的一个例子......