1

我有一个问题需要我将现有的现场制作(我在本地开发框中复制了架构,别担心)表列类型从枚举转换为字符串。

背景:

基本上,以前的开发人员让我的代码库完全混乱:迁移版本非常过时,显然他在开发的某个时间点之后从未使用过它,现在我的任务是将 Rails 1.2.6 应用程序迁移到2.3.5。

我无法让测试在 2.3.5 上正常运行,因为我的表列具有 ENUM 列类型,并且它们在我的 schema.rb 上转换为:string:limit => 0这会在执行 rake 时产生无效默认值的问题db:test:prepare,例如的:

Mysql::Error: Invalid default value for 'own_vehicle': CREATE TABLE `lifestyles` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `member_id` int(11) DEFAULT 0 NOT NULL, `own_vehicle` varchar(0) DEFAULT 'Y' NOT NULL, `hobbies` text, `sports` text, `AStar_activities` text, `how_know_IRC` varchar(100), `IRC_referral` varchar(200), `IRC_others` varchar(100), `IRC_rdrive` varchar(30)) ENGINE=InnoDB

我正在考虑编写一个迁移任务,查看所有数据库表中的枚举列并将其替换为 VARCHAR,我想知道这是否是解决此问题的正确方法。或者更好的是,如果有一种方法可以解决这个问题而无需修改数据库,那就更好了!

我也不确定如何编写它,以便它遍历我的数据库表并将所有 ENUM 替换colum_types为 VARCHAR。

参考

4

1 回答 1

2

我也在寻找一种解决方案来修复枚举的 schema.rb 文件,因为 RoR(目前是 3.1.3 版)将它们称为限制为 0 的字符串。

看起来有一个插件/gem 可以在不更改数据库的情况下处理枚举类型。在 Rails 1 和 2 上有一个插件:http ://enum-column.rubyforge.org/ 在 Rails 3 上有一个类似的 gem: https ://github.com/electronick/enum_column

将 enum_column3 添加到 Gemfile(并运行 bundle update)或安装插件后,然后运行 ​​rake 任务 db:schema:dump 以重新生成 schema.rb 文件。

我看到的这个插件/gem 的唯一缺点是您必须将使用这些字段的应用程序中的代码(因此您必须找到所有内容)从字符串更改为符号,并将 validates_inclusion_of 更改为 validates_columns。不过,我用 grep 和 vi 做这件事并没有花太长时间。

或者,您可以像 Robert 上面所说的那样直接更改 MySQL,使其符合 RoR 的预期。但我个人更喜欢继续使用 Enum 类型。(我有 LAMP 背景。)将枚举视为 varchar,在模型中使用 validates_inclusion_of,非常适用于不使用 schema.rb 的所有内容。只是测试和迁移有问题。

或者,您可以继续手动编辑 schema.rb 文件以修复限制。(到目前为止,这就是我们一直在做的事情,但这很烦人。)

(我想我没有足够的代表点来添加评论?史蒂夫的回答让我很生气。你肯定想要使用迁移,因为那样你就可以保证在开发中进行与生产中相同的更改。制作一个太容易了即使在部署期间复制粘贴 SQL 也会出错。相信我,我凭经验知道这一点。此外,迁移是保存更改的标准位置。如果从较旧的备份恢复,您可能需要重新应用它们。 )

于 2012-03-05T19:14:42.613 回答