2012-02-19 8 views
0

私はSinatraアプリケーションでdatamapperを使用しています。私は現在、コマンドを使用して、移行を処理するためにdatamapperを使用してクラスからプロパティを削除するときにデータベースフィールドを削除します

DataMapper.finalize.auto_upgrade! 

を使用しています。私は 'has_n'と 'belongs_to'の関連付けを持つ2つのクラス(アーティストとイベント)を持っていました。 'belongsed_to'というイベントは、アーティストとアーティストが関連するイベントを多数持つことができます。

Iは、モデルの元ONE_TO_MANYアソシエーションを支配クラス定義の前の部分を削除し、イベントクラスに対応するコードに

has n, :artists, :through => Resource 

を添加することによってmany_to_many関係であるとの関連付けを変更アーティストクラス。新しいイベントを作成すると、エラーが発生します。

#<DataObjects::IntegrityError: events.artist_id may not be NULL 

:artist_idフィールドは、2つのクラス間の元の関連付けの遺物です。新しいmany_to_many関連付けは、event.artists [i]によってアクセスされます(ここで、 'i'は、0から関連付けられたアーティスト数-1までの整数インデックスです)。どうやら、ArtistクラスとEventクラスの元の関連付けメソッドはまだありますか?私の推測では、この解決策は、datamapperに組み込まれたauto_upgradeメソッドを使用するのではなく、明示的な移行を記述することです。このタイプの変更をデータベースに処理する方法があり、auto_upgradeメソッドが機能していれば、それは素晴らしいことです!

私のモデルなどの詳細が必要な場合は、お気軽にお問い合わせください。

答えて

1

私の経験では、DataMapperのauto_upgradeはあまりうまく動作しません。あるいは、少なくとも、それが期待通りに動作しません。モデルに新しい列を追加する場合は、必要な処理を行います。列にもっと洗練されたものをしようとすると、おそらく期待どおりに動作しません。

たとえば、タイプStringのプロパティを作成すると、最初は50文字の長さになります。文字列を保持する文字数が50文字ではない場合は、モデルに:length => 100を追加するだけでは、auto_upgradeは列の幅を変更できません。

あなたのケースでは、おそらくDataMapperの動作がそれほど悪くない(レガシーデータベースを考えている)と主張するかもしれませんが、別の欠点を見つけたようです。しかし、実際には、関連付けを変更したときにEventartist_id列は削除されず、Eventを保存しようとするとデータベースに必須フィールドであると表示されるため、エラーが発生します。

エラーは、検証エラーではないことに注意してください。DataMapperはすべてが正常であると考えますが、オブジェクトを保存しようとするとデータベースからエラーが発生します。

希望すると便利です。

0

自動アップグレードは欠点ではありません。私はDataMapperの便利な機能として自動アップグレードを考えています。私の知る限りでは、あなたのために列を追加することだけが目的です。したがって、プロジェクトを迅速に開始し、移行を記述することなくテスト環境と開発環境を管理するのは素晴らしいですが、成熟したライブプロジェクトを変更するための最良のツールではありません。

そのため、DataMapperには移行があります。 dm-migrations gemを使用してください。欠点は、それらがあまりよく文書化されていないということです。私は実際に私の現在のプロジェクトを移行を使って変更する作業をしており、dm-migrations github wikiにいくつかの指示を寄稿したいと考えています。ただし、移行に移行する準備ができていない場合は、SQLクライアントを使用して列を手動で更新し、引き続き新しい列に対して自動アップグレードを使用することもできます。それは私のプロジェクトで2年間行ってきたことです:)

+0

私はまた、ローカルでnavicatで列を削除していますが、私は明らかに英雄のアプリのために適切に動作するようにしたいと思います。 – wuliwong

関連する問題