1

既存のライブ プロダクションを変換する必要があるという問題があります (ローカル開発ボックスにスキーマを複製しましたが、心配しないでください) テーブルの列の型を列挙型から文字列に変換する必要があります。

バックグラウンド:

基本的に、以前の開発者は私のコードベースを完全に混乱させたままにしました。移行バージョンは非常に古く、開発のある時点以降は使用していないようで、Rails 1.2.6 アプリを2.3.5.

2.3.5 でテストを適切に実行できません。これは、テーブルの列に ENUM 列の型があり、schema.rb で に変換される:stringため:limit => 0です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 に置き換える移行タスクを作成することを考えていますが、これがこの問題にアプローチする正しい方法であるかどうか疑問に思っています。または、データベースを変更せずにこれを修正する方法があれば、なおさらです。

colum_typesまた、データベーステーブルをループしてすべての ENUMを VARCHARに置き換えるように記述する方法もわかりません。

参考文献

4

1 に答える 1

2

RoR (現時点ではバージョン 3.1.3) は制限 0 の文字列を呼び出すため、列挙型の schema.rb ファイルも修正するソリューションを探していました。

データベースを変更せずに列挙型を処理するためのプラグイン/宝石があるようです。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 を使ってこれを行うのにそれほど時間はかかりませんでした。

または、RoR が期待するものと一致するように、Robert が上で述べたように MySQL を直接変更することもできます。しかし、私は個人的に Enum 型を使い続けることを好みます。(私は LAMP のバックグラウンドを持っています。) モデルで validates_inclusion_of を使用して enum を varchar として扱うと、schema.rb を使用しないすべてのものでうまく機能します。テストと移行だけに問題があります。

または、schema.rb ファイルを手動で編集し続けて制限を修正することもできます。(それは私たちがこれまでやってきたことですが、面倒です。)

(コメントを追加するのに十分な担当者がいないと思いますか?スティーブの答えは私をいらいらさせます.移行を使用したいのは間違いありません.展開中の SQL のコピー アンド ペーストでさえミス. 私を信じてください, 私は経験によってこれを知っています. さらに、移行は、変更を保持するための標準的な場所です. 古いバックアップから復元する場合は、それらを再適用する必要がある場合があります. )

于 2012-03-05T19:14:42.613 に答える